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

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的位的数量,通过指定的startend参数,可以让计数只在特定的字节(注意startend指的是字节,不是位,演示中会进行说明)上进行。

startend参数的设置和GETRANGE命令类似,都可以使用负数值,比如 -1 表示倒数第一个字节,而 -2 表示倒数第二个字节:Redis - 字符串STRLEN、APPEND、SETRANGE、GETRANGE命令介绍

演示

不存在的键key会被当成是空位图来处理,因此对一个不存在的键key进行BITCOUNT操作时,结果会为 0 。
在这里插入图片描述
使用startend参数。
在这里插入图片描述
在这里插入图片描述

由上图可知,startend参数指的是字节,不是位。

BITPOS

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

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

演示
在这里插入图片描述
使用startend参数。
在这里插入图片描述
结果很显然是正确的。

BITOP

BITOP operation destkey key [key …]
可用版本: >= 2.6.0
时间复杂度: O(N)

对一个或多个键key对应的位图进行位操作,并将结果保存到 destkey 上。

operation 可以是 ANDORNOTXOR 这四种操作中的任意一种。除了 NOT 操作之外,其他操作都可以接受一个或多个键key作为输入。

当BITOP命令处理不同长度的位图时,较短的那个位图所缺少的部分会被看作0。不存在的键key也被看作是包含0的位图。所以,保存到 destkey 的位图长度,和输入键key 中最长的位图长度相等。

演示

在这里插入图片描述
AND操作:
在这里插入图片描述
OR操作:
在这里插入图片描述
NOT操作:

在这里插入图片描述
XOR 操作:
在这里插入图片描述
结果也都符合预期。

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITKaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值