BitMap
这是一种数据类型,该数据类型本质上就是一个仅包含 0 和 1 的二进制字符串。而其所有相关命令都是对这个字符串二进制位的操作。用于描述该字符串的属性有三个:key、offset、bitValue。
-
key:BitMap 是 Redis 的 key-value 中的一种 Value 的数据类型,所以该 Value 一定有其对应的 key。
-
offset:每个 BitMap 数据都是一个字符串,字符串中的每个字符都有其对应的索引,该索引从 0 开始计数。该索引就称为每个字符在该 BitMap 中的偏移量 offset。这个 offset的值的范围是[0,2^32 -1],即该 offset的最大值为 4G-1,即 4294967295,42 亿多。
-
bitValue:每个 BitMap 数据中都是一个仅包含 0 和 1 的二进制字符串,每个 offset 位上的字符就称为该位的值 bitValue。bitValue 的值非 0 即 1。
setbit
格式:SETBIT key offset value
功能:为给定 key 的BitMap 数据的 offset 位置设置值为 value。其返回值为修改前该 offset位置的 bitValue
说明:对于原 BitMap 字符串中不存在的 offset 进行赋值,字符串会自动伸展以确保它可以将 value 保存在指定的 offset 上。当字符串值进行伸展时,空白位置以 0 填充。当然,设置的 value 只能是 0 或 1。不过需要注意的是,对使用较大 offset 的 SETBIT 操作来说,内存分配过程可能造成 Redis 服务器被阻塞。
getbit
格式:GETBIT key offset
功能:对 key 所储存的 BitMap 字符串值,获取指定 offset 偏移量上的位值 bitValue。
说明:当 offset 比字符串值的长度大,或者 key 不存在时,返回 0 。
bitcount
格式:BITCOUNT key [start] [end]
功能:统计给定字符串中被设置为 1 的 bit 位的数量。一般情况下,统计的范围是给定的整个 BitMap 字符串。但也可以通过指定额外的 start 或 end 参数,实现仅对指定字节范围内字符串进行统计,包括 start 和 end 在内。注意,这里的 start 与 end 的单位是字节,不是 bit,并且从 0 开始计数。
说明:start 和 end 参数都可以使用负数值: -1 表示最后一个字节, -2 表示倒数第二个字节,以此类推。另外,对于不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。
bitpos
格式:BITPOS key bit [start] [end]
功能:返回 key 指定的 BitMap 中第一个值为指定值 bit(非 0 即 1) 的二进制位的位置。pos,即 position,位置。在默认情况下, 命令将检测整个 BitMap,但用户也可以通过可选的 start 参数和 end 参数指定要检测的范围。
说明:start 与 end 的意义与 bitcount 命令中的相同。
bitop
格式:BITOP operation destkey key [key …]
功能:对一个或多个 BitMap 字符串 key 进行二进制位操作,并将结果保存到 destkey 上。
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:
-
BITOP AND destkey key [key …] :对一个或多个 BitMap 执行按位与操作,并将结果保存到 destkey 。
-
BITOP OR destkey key [key …] :对一个或多个 BitMap 执行按位或操作,并将结果保存到 destkey 。
-
BITOP XOR destkey key [key …] :对一个或多个 BitMap 执行按位异或操作,并将结果保存到 destkey 。
-
BITOP NOT destkey key :对给定 BitMap 执行按位非操作,并将结果保存到 destkey 。
说明:
-
除了 NOT 操作之外,其他操作都可以接受一个或多个 BitMap 作为输入。
-
除了 NOT 操作外,其他对一个 BitMap 的操作其实就是一个复制。
-
如果参与运算的多个 BitMap 长度不同,较短的 BitMap 会以 0 作为补充位与较长BitMap 运算,且运算结果长度与较长 BitMap 的相同。