SETBIT
SETBIT key offset value
1
可用版本:>= 2.2.0
时间复杂度: O(1)
1
2
对键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
1
可用版本:>= 2.2.0
时间复杂度:O(1)
1
2
获取指定的键key对应的位图指定偏移量上的位。
演示
当偏移量比键key对应的位图的长度大时,或者键key不存在时,GETBIT命令会返回0。
GETBIT命令会返回指定的键key对应的位图指定偏移量上的位。
BITCOUNT
BITCOUNT key [start end]
1
可用版本:>= 2.6.0
时间复杂度:O(N)
1
2
计算给定键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]
1
可用版本: >= 2.8.7
时间复杂度: O(N),其中 N 为位图包含的二进制位数量
1
2
返回位图中第一个值为 bit 的二进制位的位置。start 和 end 参数指定要检测的字节范围。
演示
使用start和end参数。
结果很显然是正确的。
BITOP
BITOP operation destkey key [key …]
1
可用版本: >= 2.6.0
时间复杂度: O(N)
1
2
对一个或多个键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命令就介绍到这里。
写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!
————————————————
版权声明:本文为CSDN博主「ITKaven」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37960603/article/details/109843407