深入Redis位图
Posted ikct2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入Redis位图相关的知识,希望对你有一定的参考价值。
位图
位图不是特殊的数据结构,其内容就是普通的字符串,即byte数组,可以使用get
/set
直接获取整个位图的内容,也可以通过getbit
/setbit
来将byte数组看成位数组来处理。
基本使用
Redis的位数组是自动拓展的,若偏移位置超出现有范围,则自动用0扩充。
get
整取,set
整存,getbit
零取,setbit
零存,对应的则是直接操作字符串还是操作位。
统计和查找
bitcount
用于统计指定位置范围内1的个数,bitpos
用于查找指定范围内出现的第一个0或1的位。
bitcount
所设置的范围是字符的范围而不是位的范围,也就是说,这个范围是对字符的索引,其位范围是8的倍数。
魔术指令bitfield
前面设置和获取指定位的值都是单个位的,如要一次操作多个位,则必须使用管道来处理。但是从Redis3.2开始,增加了一条指令,使得不用管道也能一次操作多个位。
bitfield
有三个子指令,分别是get
/set
/incrby
,它们可以对指定位片段进行读写,但最多只能处理64个连续位,超过64个就必须使用多个子指令,bitfield
支持一次执行多个子指令。
127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w get u4 0 # 从第一个位开始取4个位,结果是无符号数u
(integer) 6
127.0.0.1:6379> bitfield w get u3 2 # 从第3个位开始取3个位,结果是无符号数u
(integer) 5
127.0.0.1:6379> bitfield w get i4 0 # 从第一个位开始取4个位,结果是符号数i
1) (integer) 6
127.0.0.1:6379> bitfield w get i3 2 # 从第3个位开始取3个位,结果是符号数i
1) (integer) -3
无符号数就是取位数组全部为值,符号数就是取位数组第一位为符号,其它位为值。
127.0.0.1:6379> bitfield w get u4 0 get u3 2 get i4 0 get i3 2 # 一次执行多条子指令
1) (integer) 6
2) (integer) 5
3) (integer) 6
4) (integer) -3
127.0.0.1:6379> bitfield w set u8 8 97 # 从第八位开始,接下来的8位用无符号数97替代
1) (integer) 101
127.0.0.1:6379> get w
"hallo"
incrby
指令对指定范围位进行自增操作,溢出将会折返,无符号数0-255,有符号数-128-127。
bitfield
提供溢出策略子指令overflow
,默认折返wrap
,还可选择失败fail
(报错不执行),饱和截断sat
(超过范围停留在极值),overflow
指令只影响一条指令,后续继续默认折返wrap
。
bitfield
可同时混合执行多个get
/set
/incrby
子指令。
以上是关于深入Redis位图的主要内容,如果未能解决你的问题,请参考以下文章