本篇介绍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. Linux中环境变量的设置

    目录 环境变量 Shell定义的环境变量 查看环境变量 Linux下环境变量的设置 环境变量 在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软 ...

  2. 解决Failed to execute goal se.eris:notnull-instrumenter-maven-plugin:0.6.8

    https://blog.csdn.net/fanrenxiang/article/details/80864908 github拉起来的项目,jdk是11,而我电脑上的jdk是1.8.原因是jdk版 ...

  3. linux 查看运行java所在目录

    通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息 需要查看pos_service.jar的绝对路径(在哪里目录下)  使用:ll /proc/PID Linux在启动一个进 ...

  4. shell 脚本中常用的内置变量

    在 Bash 解释器中,内置了许多变量,这些变量的功能是解释器自带的,我们在编写shell脚本时如果能灵活的使用它们,对脚本的编写效率以及差错大有帮助, 下面一一介绍这些变量 $FUNCNAME.$L ...

  5. springboot国际化与@valid国际化支持

    springboot国际化 springboot对国际化的支持还是很好的,要实现国际化还简单.主要流程是通过配置springboot的LocaleResolver解析器,当请求打到springboot ...

  6. C++逆向分析----虚函数与多层继承

    虚函数 C++通过关键字virtual来将函数声明为一个虚函数.当一个类包含虚函数后编译器就会给类的实例对象增加一个虚表指针,所谓的虚表指针就是指向虚表的指针.虚表就是一张地址表,它包含了这个类中所有 ...

  7. 各大搜索引擎 User-Agent

    百度PC User-Agent Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider ...

  8. oo——第三单元总结

    前言 第三单元是我们学习oo以来第一次接触JML.这一单元的三次作业和以前一样,采用了难度递进的方式,而且前一次作业的设计思路在下一次作业都多多少少有些体现(或者说是在其基础上做出的改进).而且本单元 ...

  9. CRM系统有哪几种常见类型?

    随着市场的快速变化,客户开始变得越来越重要,因此CRM客户管理系统开始逐渐被企业所认可.从CRM系统进入中国市场到现在十余年的发展中,越来越多的CRM厂商开始出现.为了满足不同行业.不同类型的企业的需 ...

  10. BUUCTF(十一)[极客大挑战 2019]Knife

    BUUCTF系列 想着应该不会这么简单吧... 结果就是这么简单ee 疯狂暗示... url:xxx/index.php 密码:Syc 连接成功... cd / ls cat flag