1.概述
Redis从2.2.0版本开始新增了setbit,getbit,bitcount,bitop等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit
等命令只不过是在set
上的扩展。通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。Bitmaps 本身不是一种数据结构,实际上它就是字符串(key 对应的 value 最后的一串二进制),但是它可以对字符串的位进行操作。 Bitmaps 单独提供了一套命令,所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。可以把 Bitmaps 想象成一个以 位 为单位的数组,数组的每个单元只能存储 0 和 1,数组的下标在Bitmaps中叫做偏移量。
2.常见命令
setbit :设置或者清空key的value(字符串)在offset处的bit值(只能只0或者1)。
getbit: 获取偏移量未offset的值
bitcount:计算给定字符串中,被设置为 1 的比特位的数量,一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。
bitop:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到另外一个字符串
3.命令使用
127.0.0.1:6379> setbit sign_0 0 1 //sign_0 第零位设置1
(integer) 0
127.0.0.1:6379> setbit sign_0 1 1
(integer) 0
127.0.0.1:6379> setbit sign_1 0 0
(integer) 1
127.0.0.1:6379> setbit sign_2 0 1
(integer) 1
127.0.0.1:6379> getbit sign_0 1
(integer) 1
127.0.0.1:6379> bitcount sign_0 0 -1 //计算sign_0 所有1的个数
(integer) 2
//对sign_0 sign_1 sign_2求逻辑异或,并将结果保存到 dest
127.0.0.1:6379> bitop xor dest sign_0 sign_1 sign_2
(integer) 1
//对sign_0,sign_1,sign_2 求逻辑并,并将结果保存到dest
127.0.0.1:6379> bitop and dest sign_1 sign_2
(integer) 1
对sign_0 sign_1 sign_2 求逻辑或,并将结果保存到 dest
127.0.0.1:6379> bitop or dest sign_1 sign_2
(integer) 1
//对sign_1 求逻辑非,并将结果保存到 dest
127.0.0.1:6379> bitop not dest sign_1
(integer) 1
4.使用场景
1.统计活跃用户
2.签到
3. 布隆过滤器
4.用户在线状态
5.bitmap使用注意
bitmap是基于redis的字符串类型的. 而一个字符串类型最多存储512M