本篇介绍Bitmaps和HyperLogLog。

一、Bitmaps

计算机中最小的单位是bit(位),很多计算机语言也提供了位操作符,比如Java中就有&、|、>>、>>>、<<、~、^ 。1bit可以存储0和1两种值。介绍几个Redis的Bitmaps相关的操作

  • bitop

完整的命令参数是bitop operation destkey key [key...]

其中operation是位操作类型,支持and、or、not、xor,分别就是与、或、非、异或。destkey是用来存储计算结果的变量,key是参与运算是变量,可以指定多个。

127.0.0.1:6379> set bitkey1 "\x8e"
OK
127.0.0.1:6379> set bitkey2 "\xa5"
OK
127.0.0.1:6379> bitop and bitkey3 bitkey1 bitkey2
(integer) 1
127.0.0.1:6379> get bitkey3
"\x84"
127.0.0.1:6379> bitop or bitkey4 bitkey1 bitkey2
(integer) 1
127.0.0.1:6379> get bitkey4
"\xaf"
127.0.0.1:6379> bitop not bitkey5 bitkey1
(integer) 1
127.0.0.1:6379> get bitkey5
"q"
127.0.0.1:6379> bitop xor bitkey6 bitkey1 bitkey2
(integer) 1
127.0.0.1:6379> get bitkey6
"+"

先设置bitkey1和bitkey2的值,用16进制(\x开头)设置,这时bitkey1的二进制就是10001110,bitkey2的二进制就是10100101,然后把bitkey1和bitkey2做按位与运算,把结果存到bitkey3,经过计算得10001110&10100101=10000100,刚好是16进制的"\x84",其它运算也一样,但是需要注意的是,用get命令获取key的值时,会按照字节做显示,如果刚好是ascii码表上的字符,会直接显示ascii码,比如bitkey5和bitkey6。

  • bitcount

完整命令参数是bitcount key [start end]

统计key中1的数量,可以指定下标范围,如果不指定就统计整个key。下标的范围指的是字符串下标,范围是包含start 和包含end的,也就是start <= index <= end。

127.0.0.1:6379> set bitkey "abc"
OK
127.0.0.1:6379> get bitkey
"abc"
127.0.0.1:6379> bitcount bitkey
(integer) 10
127.0.0.1:6379> bitcount bitkey 0 0
(integer) 3
127.0.0.1:6379> bitcount bitkey 0 1
(integer) 6

abc的ascii码对应的十进制整数分别是97、98、99,二进制分别是0110 0001、0110 0010、0110 0011,所以bitcount bitkey得到的结果是10,bitcount bitkey 0 0计算是字母a的二进制1的个数,bitcount bitkey 0 1计算的是a和b的二进制1的个数。

  • getbit

完整命令参数是getbit offset

获取第offset位的值,最左边的是第0位。

127.0.0.1:6379> set bk "\xa3"
OK
127.0.0.1:6379> getbit bk 0
(integer) 1
127.0.0.1:6379> getbit bk 1
(integer) 0

16进制的a3的二进制是10100011,那么第0位就是1,第1位就是0。

  • setbit

完整命令参数是setbit key offset value

其中key是键,offset是偏移量,与getbit命令的offset意义相同,value只能是1或者0。

127.0.0.1:6379> setbit bk 3 1
(integer) 0
127.0.0.1:6379> get bk
"\xb3"

这里把bk的值的第3位(从0开始计算)设置为1,原来是10100011,修改后 变成了10110011,也就是16进制的b3。

由于Bitmaps是用位来存储信息的,所以它很适合用在那种存储只有两种状态的数据的场景,用位偏移量来隐式存储整形数据,位置存储状态。例如用来存储用户的签到情况,文章已读或未读情况。比如要存储用户的签到状态,可以用第offset位的位值表示用户的签到,1为已签到,0为未签到。具体做法可以参考用Redis实现签到功能

二、HyperLogLog

HyperLogLog其实是一种算法,它是用来估算一个集合的基数的。先说明一下,这里说的集合和数学上的集合不同,这里的集合指的是若干个元素合在一起,是不具有互异性的,也就是其中的元素是可以重复的,而HyperLogLog算法正是用来计算去重之后的元素个数,就是基础。举个例子,{1, 2, 3}的基数是3,{1, 2, 3, 2, 1}的基数还是3,因为1和2已经重复了,不需要再计算。这个算法是有误差的,它只能用在计算一些对精度要求不高的场景下,比如统计页面访问的UV数,统计网站的ip数。

下面是Redis提供的HyperLogLog的相关命令:

  • pfadd

完整命令参数是pfadd key element [element ...]

将element添加到键为key的HyperLogLog结构中,这个命令可以一次添加多个element。

127.0.0.1:6379> pfadd pf one two three two one
(integer) 1
  • pfcount

完整命令参数是pfcount key [key ...]

返回key的近似基数,如果指定了多个key,返回这些key的并集的近似基数。

127.0.0.1:6379> pfcount pf
(integer) 3
127.0.0.1:6379> pfadd pf2 three four five
(integer) 1
127.0.0.1:6379> pfcount pf pf2
(integer) 5

pf只有one、two、three 3个元素,pf2,只有three、four、five 3个元素,取并集之后是5个。

  • pfmerge

完整命令参数是pfmerge destkey sourcekey [sourcekey ...]

把若干个sourcekey合并并存储到destkey,如果destkey不存在,会创建一个。

127.0.0.1:6379> pfmerge destkey pf pf2
OK
127.0.0.1:6379> pfcount destkey
(integer) 5

Redis系列(三):Bitmaps和HyperLogLog的更多相关文章

  1. Redis系列(三):Redis的持久化机制(RDB、AOF)

    本篇博客是Redis系列的第3篇,主要讲解下Redis的2种持久化机制:RDB和AOF. 本系列的前2篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. Redis系列(二): ...

  2. Redis系列三之持久化

    一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...

  3. Redis系列(三)-Redis发布订阅及客户端编程

    阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...

  4. Redis系列三(redis配置文件分析)

    在第一篇文章中有提到过redis.conf这个文件,这个文件就是redis-server的具体配置了.要使用好redis,一定要搞清楚redis的配置文件,这样才能最大的发挥redis的性能. # B ...

  5. Redis系列三:reids常用命令

    全局命令 keys *  查看所有键 dbsize 查看的是当前所在redis数据库的键总数 如果存在大量键,线上禁止使用此指令 exists key 检查键是否存在,存在返回1,不存在返回0 del ...

  6. Redis系列三 Redis数据类型

    一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...

  7. Redis系列(三)--消息队列、排行榜等

    Redis命令执行生命周期: 发送命令--->排队(单线程)--->执行命令--->返回结果 慢查询: 只是针对命令执行阶段 慢查询日志通过一个固定长度的FIFO queue,这个q ...

  8. Redis系列三 - 缓存雪崩、击穿、穿透

    前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...

  9. Redis系列(四):Redis的复制机制(主从复制)

    本篇博客是Redis系列的第4篇,主要讲解下Redis的主从复制机制. 本系列的前3篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数据 ...

  10. Redis系列(五):Redis的过期键删除策略

    本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略. 本系列的前4篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数 ...

随机推荐

  1. Python中os模块、csv模块和xlrd模块的使用

    目录 os模块的使用 open("test.txt","mode") 读取文件中的内容 f.read() f.readline(size) f.readline ...

  2. Supervisord远程命令执行漏洞(CVE-2017-11610)

    目录 Supervisor 漏洞复现 修复建议 Supervisor Supervisor是使用Python 开发的进程管理程序,一般使用命令行进行管理,当然也能通过web接口图形化管理服务.在配置了 ...

  3. 脱离xml使用JavaConfig实现Spring配置

    总结 情况一: 配置类中类名添加 @Configuration 注解,同时提供一个方法返回一个Bean实例,且这个方法添加注解 @Bean ,就可以由Spring管理此对象 如下所示: User.ja ...

  4. C++入门教程之二:变量

    C++入门教程之二:变量 变量,顾名思义,意思是变化的量.变量的定义是计算机语言中能储存计算结果或能表示值的抽象概念.一个基本的程序需要变量,因此变量是程序设计中的一大重点. 变量基本结构 var_t ...

  5. NABCD-name not found

    项目 内容 课程 2020春季计算机学院软件工程(罗杰 任健) 作业要求 团队项目选择 项目名称 FOTT 项目内容 在OCR-Form-Tools开源项目的基础上,扩展功能,支持演示更多的API,例 ...

  6. [JavaScript之BOM与DOM]

    [JavaScript之BOM与DOM] BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM ( ...

  7. Java虚拟机栈和PC寄存器

    PC Register介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息.CPU只有把数据装 ...

  8. JAVA并发(2)-ReentrantLock的见解

    上节,我们讲了AQS的阻塞与释放实现原理,线程间通信(Condition)的原理.这次,我们就讲讲基于AQS实现的ReentrantLock(重入锁). 1. 介绍 结合上面的ReentrantLoc ...

  9. Spring Cloud Alibaba(12)---Gatway概述、简单示例

    Gatway概述.项目搭建 前言 有关网关的概念之前这里不在概述,因为之前在写zuul网关的时候有详细陈述过,地址如下: SpringCloud(7)---网关概念.Zuul项目搭建 SpringCl ...

  10. mysql注入getshell

    0x00 利用条件 root权限 secure_file_priv=为空或者在网站根目录下(网站根目录为d:\www,secure_file_priv=d:\也可以) 知道绝对路径 gpc关闭,这个应 ...