SETBIT
SETBIT key offset value
可用版本:>= 2.2.0
时间复杂度: O(1)
对键key
对应的位图(其实是字符串,只不过该字符串的每一位都是字符0
或者字符1
,下面都叫它位图),设置或清除指定偏移量上的位(bit
),位的设置或清除取决于value
的值,它可以是0
,也可以是1
。
演示
当键key
不存在时,会自动生成一个位图。如果偏移量大于键key
对应的位图长度时,位图会先进行伸展,以确保它可以将value
保存在指定的偏移量上。当位图进行伸展时,空白位置以0
填充。SETBIT命令会返回指定偏移量原来储存的值。
偏移量offset
必须大于等于 0 ,小于 2^32
(因为字符串存储空间被限制在512 MB
之内,512=2^9,M=2^20,B=2^3,9+20+3=32
)。
GETBIT
GETBIT key offset
可用版本:>= 2.2.0
时间复杂度:O(1)
获取指定的键key
对应的位图指定偏移量上的位。
演示
当偏移量比键key
对应的位图的长度大时,或者键key
不存在时,GETBIT命令会返回0
。
GETBIT命令会返回指定的键key
对应的位图指定偏移量上的位。
BITCOUNT
BITCOUNT key [start end]
可用版本:>= 2.6.0
时间复杂度:O(N)
计算给定键key
对应的位图中,被设置为1
的位的数量,通过指定的start
和end
参数,可以让计数只在特定的字节(注意start
和end
指的是字节,不是位,演示中会进行说明)上进行。
start
和end
参数的设置和GETRANGE命令类似,都可以使用负数值,比如 -1
表示倒数第一个字节,而 -2
表示倒数第二个字节:Redis - 字符串STRLEN、APPEND、SETRANGE、GETRANGE命令介绍。
演示
不存在的键key
会被当成是空位图来处理,因此对一个不存在的键key
进行BITCOUNT操作时,结果会为 0 。
使用start
和end
参数。
由上图可知,start
和end
参数指的是字节,不是位。
BITPOS
BITPOS key bit [start end]
可用版本: >= 2.8.7
时间复杂度: O(N),其中 N 为位图包含的二进制位数量
返回位图中第一个值为 bit
的二进制位的位置。start
和 end
参数指定要检测的字节范围。
演示
使用start
和end
参数。
结果很显然是正确的。
BITOP
BITOP operation destkey key [key …]
可用版本: >= 2.6.0
时间复杂度: O(N)
对一个或多个键key
对应的位图进行位操作,并将结果保存到 destkey
上。
operation
可以是 AND
、 OR
、 NOT
、 XOR
这四种操作中的任意一种。除了 NOT
操作之外,其他操作都可以接受一个或多个键key
作为输入。
当BITOP命令处理不同长度的位图时,较短的那个位图所缺少的部分会被看作0
。不存在的键key
也被看作是包含0
的位图。所以,保存到 destkey
的位图长度,和输入键key
中最长的位图长度相等。
演示
AND
操作:
OR
操作:
NOT
操作:
XOR
操作:
结果也都符合预期。
Redis中位图的SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令就介绍到这里。
写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!