深入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位图的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个片段之间传递位图? (我正在使用 Android 导航组件)

一看就懂 详解redis的bitmap(面试加分项)

一看就懂 详解redis的bitmap(面试加分项)

一看就懂 详解redis的bitmap(面试加分项)

基于Redis位图实现系统用户登录统计

5.Redis系列Redis的高级应用-位图