redis之Bitmaps类型(位图)

1、介绍

是字符串数据类型的扩展,它可以让您像对待位向量一样对待字符串。还可以对一个或多个字符串执行按位操作。

2、基本命令

2.1、SETBIT将提供的偏移量处的位设置为0或1。返回原始位值
–格式–:SETBIT key offset value
2.2、GETBIT返回给定偏移量处的位的值。
–格式–:GETBIT key offset

redis> SETBIT mykey 7 1
(integer) 0
redis> SETBIT mykey 7 0
(integer) 1
redis> GETBIT mykey 7
0

2.3、BITOP允许您对一个或多个字符串执行按位操作。
–格式–:BITOP operation destkey key [key …]
–解释–:其中operation是位操作类型,支持and、or、not、xor,分别就是与、或、非、异或。destkey是用来存储计算结果的变量,key是参与运算是变量,可以指定多个。
–BITOP AND destkey srckey1 srckey2 srckey3 … srckeyN ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
–BITOP OR destkey srckey1 srckey2 srckey3 … srckeyN,对一个或多个 key 求逻辑或,并将结果保存到 destkey
–BITOP XOR destkey srckey1 srckey2 srckey3 … srckeyN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
–BITOP NOT destkey srckey,对给定 key 求逻辑非,并将结果保存到 destkey

redis> SET key1 "foobar"
"OK"
redis> SET key2 "abcdef"
"OK"
redis> BITOP AND dest key1 key2
(integer) 6
redis> GET dest
"`bc`ab"

2.4、BITFIELD可以一次对多个位进行操作.这个指令有三个子指令,get,set,incrby,都可以对指定位片段进行读写,但最多只能处理64个连续的位,如超过64位,则要使用多个子指令,bitfield可以一次执行多个子指令。

set mykey hello
hello对应二进制:
0110 1000  
0110 0101
0110 1100
0110 1100
0110 1111
>bitfield mykey get u4 0    #从第一个位开始取4个位(0110),结果为无符号数(u)
1)  "6"
>bitfield mykey get u3 2    #从第三个位开始取3个位(101),结果为无符号数(u)
1)  "5"
>bitfield mykey get i4 0   #从第一个位开始取4个位(0110),结果为有符号数(i)
1)  "6"
因为结果为有符号数所以,第一位符号位为0代表是正数。110为6,结果直接为6
>bitfield mykey get i3 2   #从第三个位开始取3个位(101),结果为有符号数(i)
1)  "-3"
取到的结果首位为1代表是负数,01需要取补码运算。01取反为10,10+1为11。11十进制为3,因为符号位为1所以最终结果为-3

incrby:对指定范围的位进行自增操作,如操作后有数据溢出,redis的处理是折返,即将益处的符号位丢掉,比如:8位的无符号数255,加1后变为0,而8位的有符号数127,加1后成-128.
2.5、BITCOUNT
2.5.1、格式:BITCOUNT key [start end]
默认情况下,附加参数start和end指定字节索引。我们可以使用额外的参数BIT来指定位索引。0是第1位,1是第2位,以此类推。对于负值,-1是最后一位,-2是倒数第二位,依此类推。
bitcount的start和end是字节(byte)数,而bitmap存储数据的时候是按位(bit)存储的,而1byte=8bit,所以,bitcount meykey 0 0,实际上是统计了bitmap的offect前8位为1的数量。
hello的二进制上方有可以比对

>set mykey hello
"OK"
>bitcount mykey
"21"
>bitcount mykey 0 0
"3"
>bitcount mykey 1 1
"4"

3、位图原理

redis存储的是二进制文件,假设我们此时存入一个字符串“abc”
abc对应二进制:01100001 01100010 01100011
可以比对ASCII:https://baike.sogou.com/v53369.htm?fromTitle=ASCII

>set mykey abc
"OK"
>get mykey
"abc"
>setbit mykey 6 1
"0"
>get mykey
"cbc"
>getbit mykey 6
"1"

4、应用场景

首先bitmap本质是string,string的最大长度为512m,所以它可以表示2^32=4294967296个不同的位。基本不用担心位数不够的问题
就拿最常见的点赞功能,再不需要记录点赞顺序的情况下我们就可以使用bitmap优雅的实现。当我们需要统计点赞总数时只需要使用bitcount 统计出所有为1的数即可实现。
其余的如一些用户签到、统计活跃用户、用户在线状态、用户访问量等的统计功能都十分容易使用bitmaps实现并且性能十分可观,可以节省很多内存。缺点就是当偏移量非常大的时候可能会花费更多的时间,不过总的来说还是个不错的解决方案。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值