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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值