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 个命令的执行过程。

Figure 1. 图8-2 SETBIT命令对位图的修改过程
位图的扩展
当用户执行 SETBIT 命令尝试对一个位图进行设置的时候,如果位图不存在,或者位图当前的大小无法满足用户想要执行的设置操作,那么 Redis 将对被设置的位图进行扩展,使得位图可以满足用户的设置请求。
因为 Redis 对位图的扩展操作是以字节为单位进行的,所以扩展之后的位图包含的二进制位数量可能会比用户要求的稍微多一些,并且在扩展位图的同时,Redis 还会将所有未被设置的二进制位的值初始化为 0。
比如,如果用户执行以下命令,对尚未存在的位图 bitmap002 在偏移量 10 之上的二进制位进行设置:
redis> SETBIT bitmap002 10 1
(integer) 0
那么 Redis 创建出的位图并不会只有 11 个二进制位,而是有两个字节共 16 个二进制位,如图8-3所示。

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