Redis的BitMap
前言
- 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身
- 版本:redis 2.2.0
- 新增 setbit,getbit,bitcount几个bitmap相关命令
setbit命令说明
指令 setbit key offset value
- 复杂度o(1)
- 设置或者清空key的取决于value(字符串)在offset处的bit值(只能只0或者1)
- 字符串会进行伸展(grown)以确保它可以将value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。
- offset参数必须大于或等于0,小于2^32
- 返回值 字符串值指定偏移量上原来存储的位(bit)
getbit命令说明
指令getbit key offest
- 对
key
所储存的字符串值,获取指定偏移量上的位(bit)。 - 当
offset
比字符串值的长度大,或者key
不存在时,返回0
- 返回值 字符串指定偏移量上的位
bitcount命令说明
指令bitcount key
、bitcount key start end
- 计算给定字符串中,被设置为1的比特位的数量
- 一般情况下,给定的整个字符串都会被进行计数,通过指定额外的
start
或end
参数,可以让计数只在特定的位上进行 start
和end
参数的设置和GETRANGE
命令类似,都可以使用负数值: 比如-1
表示最后一个字节,-2
表示倒数第二个字节,以此类推- 不存在的
key
被当成是空字符串来处理,因此对一个不存在的key
进行BITCOUNT
操作,结果为 0。 - 返回值 被设置为1的位的数量
使用场景
1. 用户签到
1 | Jedis redis = new Jedis("192.168.31.89",6379,100000); |
2. 统计活跃用户
使用时间作为cacheKey,然后用户ID为offset,如果当日活跃过就设置为1 那么我该如果计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只有有一天在线就称为活跃)
一个新的命令 BITOP operation destkey key [key ...]
说明 :
- 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上
- BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数
1 | Map<String,List<Integer>>dateActiveuser = new HashMap<>(); |
假设当前站点有5000W用户,那么一天的数据大约为50000000/8/1024/1024=6MB
3. 用户在线状态
前段时间开发一个项目,对方给我提供了一个查询当前用户是否在线的接口。不了解对方是怎么做的,自己考虑了一下,使用bitmap是一个节约空间效率又高的一种方法,只需要一个key,然后用户ID为offset,如果在线就设置为1,不在线就设置为0,和上面的场景一样,5000W用户只需要6MB的空间。
1 | //批量设置在线状态 |