SETBIT

SETBIT key offset value
可用版本:>= 2.2.0
时间复杂度: O(1)

对键​​key​​​对应的位图(其实是字符串,只不过该字符串的每一位都是字符​​0​​​或者字符​​1​​​,下面都叫它位图),设置或清除指定偏移量上的位(​​bit​​​),位的设置或清除取决于​​value​​​的值,它可以是​​0​​​,也可以是​​1​​。

演示

当键​​key​​​不存在时,会自动生成一个位图。如果偏移量大于键​​key​​​对应的位图长度时,位图会先进行伸展,以确保它可以将​​value​​​保存在指定的偏移量上。当位图进行伸展时,空白位置以​​0​​填充。SETBIT命令会返回指定偏移量原来储存的值。

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_偏移量


偏移量​​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​​。

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_redis_02


GETBIT命令会返回指定的键​​key​​对应的位图指定偏移量上的位。

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_偏移量_03

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 。

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_redis_04


使用​​start​​​和​​end​​参数。

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_时间复杂度_05


Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_位图_06

由上图可知,​​start​​​和​​end​​参数指的是字节,不是位。

BITPOS

BITPOS key bit [start end]
可用版本: >= 2.8.7
时间复杂度: O(N),其中 N 为位图包含的二进制位数量

返回位图中第一个值为 ​​bit​​​ 的二进制位的位置。​​start​​​ 和 ​​end​​ 参数指定要检测的字节范围。

演示

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_时间复杂度_05


使用​​start​​​和​​end​​参数。

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_位图_08


结果很显然是正确的。

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​​ 中最长的位图长度相等。

演示

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_位图_09


​AND​​操作:

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_位图_10


​OR​​操作:

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_时间复杂度_11


​NOT​​操作:

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_位图_12


​XOR​​ 操作:

Redis:位图SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令介绍_偏移量_13


结果也都符合预期。

Redis中位图的SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP命令就介绍到这里。

写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!