第22章 二进制位数组
Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个命令用于处理二进制位数组(bit array,又称“位数组”)。
其中,SETBIT命令用于为位数组指定偏移量上的二进制位设置值,位数组的偏移量从0开始计数,而二进制位的值则可以是0或者1:
redis> SETBIT bit 0 1 # 0000 0001
(integer) 0
redis> SETBIT bit 3 1 # 0000 1001
(integer) 0
redis> SETBIT bit 0 0 # 0000 1000
(integer) 1
而GETBIT命令则用于获取位数组指定偏移量上的二进制位的值:
redis> GETBIT bit 0 # 0000 1000
(integer) 0
redis> GETBIT bit 3 # 0000 1000
(integer) 1
BITCOUNT命令用于统计位数组里面,值为1的二进制位的数量:
redis> BITCOUNT bit # 0000 1000
(integer) 1
redis> SETBIT bit 0 1 # 0000 1001
(integer) 0
redis> BITCOUNT bit
(integer) 2
redis> SETBIT bit 1 1 # 0000 1011
(integer) 0
redis> BITCOUNT bit
(integer) 3
最后,BITOP命令既可以对多个位数组进行按位与(and)、按位或(or)、按位异或(xor)运算:
redis> SETBIT x 3 1 # x = 0000 1011
(integer) 0
redis> SETBIT x 1 1
(integer) 0
redis> SETBIT x 0 1
(integer) 0
redis> SETBIT y 2 1 # y = 0000 0110
(integer) 0
redis> SETBIT y 1 1
(integer) 0
redis> SETBIT z 2 1 # z = 0000 0101
(integer) 0
redis> SETBIT z 0 1
(integer) 0
redis> BITOP AND and-result x y z # 0000 0000
(integer) 1
redis> BITOP OR or-result x y z # 0000 1111
(integer) 1
redis> BITOP XOR xor-result x y z # 0000 1000
(integer) 1
也可以对给定的位数组进行取反(not)运算:
redis> SETBIT value 0 1 # 0000 1001
(integer) 0
redis> SETBIT value 3 1
(integer) 0
redis> BITOP NOT not-value value # 1111 0110
(integer) 1
本章将对Redis表示位数组的方法进行说明,并介绍GETBIT、SETBIT、BITCOUNT、BITOP四个命令的实现原理。