1. 简介
Redis的位图(bitmap)是由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量(也称索引),用户通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作
2. setbit
setbit bitmap offset value
:为位图指定偏移量上的二进制位设置值,返回二进制位被设置之前的旧值作为结果, offset是偏移量,即指定的下标,value是0或者1
-
位图的拓展
- 位图不存在 拓展为8个bit为
- 位图不够大,比如8个bit位,假设bitmap1已经存在,执行
setbit bitmap1 10 1
则会加上8个比特位(按字节加,最少加8个),执行setbit bitmap1 20 1
,则会加上16个比特位 - 拓展出来的bit位上面的值是0
-
偏移量只能为非负数
3. getbit
getbit bitmap offset
:获取位图指定偏移量上的二进制位的值
4. bitcount
bitcount bitmap [start end]
:对位图包含的的二进制位进行统计算,[start,end]指定字节范围,默认是所有字节
example:
设置如下bitmap:
可以使用负数索引
5. bitpos
bitpos bitmap value [start] [end]
:在位图中查找第一个被设置为指定值的二进制位,并返回这个二进制位的偏移量, 默认查找所有字节
字节索引可以是负数
- 边界情况
- 一个不存在的位图或者一个所有位都被设置成了0的位图中查找值为1的二进制位时,返回0
- 一个所有位都被设置成1的位图中查找值为0的二进制位,返回最大偏移量加上1
6. bitop
bitop op result bitmap1 [bitmap2...]
:对多个bitmap进行运算,运算结果存放到result中,op可以是AND、OR、XOR、NOT,回被存储位图的字节长度
example:
bitmap1: 1 0 0 1 0 0 1 0
bitmap2: 0 1 0 0 1 0 1 0
- NOT运算只允许使用一个位图作为输入
- BITOP命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作0
7. bitfield
bitfield bitmap set type offset value
:在位图的指定偏移量offset上设置一个type类型的整数值value
- offset参数用于指定设置的起始偏移量。这个偏移量从0开始计算
- type参数用于指定被设置值的类型,以i或者u为前缀,后跟被设置值的位长度,i表示被设置的值为有符号整数,u则表示被设置的值为无符号整数
- value参数用于指定被设置的整数值,这个值的类型应该和type参数指定的类型一致
多次使用set:
- 设置可以在位图的任意偏移量上进行,被设置区域之间不必是连续的,也不需要进行对齐
- 在同一个位图中可以存储多个不同类型和不同长度的整数
-
根据索引对区域进行设置
bitfield bitmap set type #index value
:根据给定类型的位长度,对位图在指定索引上存储的整数值进行设置,适用于位图中存储的都是相同类型的整数
-
获取区域存储的值
bitfield bitmap get type #index
-
执行加法操作或减法操作
bitfield bitmap incrby type offset increament
: 获取offset索引开始的一个type类型的整数,加上增量
bitfield bitmap incrby type #index increament
: 获取第index(0开始)个type类型的整数,加上增量
减法操作增量为负数即可
- 处理溢出操作
回绕 :向上溢出的整数值将从类型的最小值开始重新计算,而向下溢出的整数值则会从类型的最大值开始重新计算
饱和:向上溢出的整数值将被设置为类型的最大值,而向下溢出的整数值则会被设置为类型的最小值
失败:检测到计算会引发溢出时拒绝执行计算,并返回空值表示计算失败
默认以WRAP方式处理溢出
8. 使用字符串命令操作位图
位图是在字符串的基础上实现的,所以它会把位图键看作一个字符串键
参考书目:
《Redis使用手册》 黄健宏