位图
位图的最小单位是比特,每个bit的取值只能是0或1,不是特殊的数据结构,它的内容其实是普通的字符串,也就是byte数组。我们可以用普通的set/get直接获取和设置整个位图的内容,也可以使用位图操作getbit/setbit等将byte数组看成"位数组"来处理。
基本用法
redis的位数组是自动扩展的,如果设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充
setbit s 1 1
setbit s 2 1
sitbit s 4 1
sitbit s 9 1
sitbit s 10 1
sitbit s 13 1
sitbit s 15 1
get s
getbit s 1 1
-
零存整取
-
零存零取
-
整存整取
如果对于的字符是不可打印字符,redis-cli会显示该字符的十六进制形式
统计和查找
bitcount来统计指定范围内1的个数
bitops用来查找指定范围内出现的第一个0或1 [start,end] start和end参数是字节索引
set w hello
bitcount w
bitcount w 0 0
bitops w 0
魔术指令bitfield
bitfield有三个子指令,分别是get、set、incrby。对指定位片段进行读写,但是最多只能处理64个连续的位,如果超出64位,就得使用多个子指令,bitfield可以一次执行多个子指令
set w hello
bitfield w get u4 0 # 从第一个位开始取4个位,结果是无符号数
bitfield w get u3 2 # 从第三个位开始取3个位,结果是无符号数
bitfield w get i4 0 # 从第一个位开始取4个位,结果是有符号数
可以一次执行多个子指令
bitfield w get u4 0 get u3 2 get i4 0 get i3 2
使用set子指令将第二个字符e改成a,a的ASCII码是97
bitfield w set u8 8 97 # 从第9个位开始,将接下来的8个位用无符号数97替换
第三个子指令incrby,对指定范围的位进行自增操作。自增有可能出现溢出,增加正数,出现上溢出,负数出现下溢出
set w hello
bitfield w incrby u4 2 1 # 从第三个位开始,对接下来的4位无符号数 + 1
bitfield w incrby u4 2 1
bitfield 指令提供了溢出策略子指令overflow,用户可以选择溢出行为,默认是折返(wrap),还可以选择失败(fail)报错不执行,以及饱和截断(sat)超过了范围就停留在最大或最小值。只影响第一条指令,后面还是warp
饱和极端
set w hello
bitfield w overflow sat incrby u4 2 1
bitfield w overflow sat incrby u4 2 1
失败不执行
set w hello
bitfield w overflow fail incrby u4 2 1