Redis系列(三):Bitmaps和HyperLogLog
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis系列(三):Bitmaps和HyperLogLog,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3916字,纯文字阅读大概需要6分钟。
内容图文
![Redis系列(三):Bitmaps和HyperLogLog](/upload/InfoBanner/zyjiaocheng/874/659428291a934bf4bf463b4f67077186.jpg)
本篇介绍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全部内容,希望文章能够帮你解决Redis系列(三):Bitmaps和HyperLogLog所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。