SETBIT:设置二进制位的值

通过使用 SETBIT 命令,用户可以为位图指定偏移量上的二进制位设置值:

SETBIT bitmap offset value

SETBIT 命令在对二进制位进行设置之后,将返回二进制位被设置之前的旧值作为结果。

举个例子,如果我们想要将位图 bitmap001 的值设置成 10010100,那么可以执行以下 3 个命令:

redis> SETBIT bitmap001 0 1
(integer) 0 -- 二进制位原来的值为0
redis> SETBIT bitmap001 3 1
(integer) 0
redis> SETBIT bitmap001 5 1
(integer) 0

图8-2展示了以上 3 个命令的执行过程。

image 2025 01 03 21 51 56 566
Figure 1. 图8-2 SETBIT命令对位图的修改过程

位图的扩展

当用户执行 SETBIT 命令尝试对一个位图进行设置的时候,如果位图不存在,或者位图当前的大小无法满足用户想要执行的设置操作,那么 Redis 将对被设置的位图进行扩展,使得位图可以满足用户的设置请求。

因为 Redis 对位图的扩展操作是以字节为单位进行的,所以扩展之后的位图包含的二进制位数量可能会比用户要求的稍微多一些,并且在扩展位图的同时,Redis 还会将所有未被设置的二进制位的值初始化为 0。

比如,如果用户执行以下命令,对尚未存在的位图 bitmap002 在偏移量 10 之上的二进制位进行设置:

redis> SETBIT bitmap002 10 1
(integer) 0

那么 Redis 创建出的位图并不会只有 11 个二进制位,而是有两个字节共 16 个二进制位,如图8-3所示。

image 2025 01 03 21 53 47 686
Figure 2. 图8-3 包含16个二进制位的位图bitmap002

从这个图我们也可以看到,除了偏移量为 10 的二进制位之外,其他所有未被设置的二进制位都被初始化成了 0。

偏移量只能为正数

与一些 Redis 命令可以使用负数作为偏移量的做法不同,SETBIT 命令只能使用正数偏移量,尝试输入负数作为偏移量将引发一个错误:

redis> SETBIT bitmap001 -1 1
(error) ERR bit offset is not an integer or out of range

其他信息

  • 复杂度:O(1)。

  • 版本要求:SETBIT 命令从 Redis 2.2.0 版本开始可用。