上一篇:Redis 系列08--Redis GEO_fengxianaa的博客-CSDN博客
位图,在 Redis 中是利用 String 来实现bitmap,字符串最大512M,所以最多2^32位
1. 主要命令
- setbit:对 key 所储存的字符串值,设置或清除指定位的值,返回原来的值
- 下图,分别设置 第 2 位 和 第 101 位的值为 1
-
- getbit:获取指定位上的值
-
- bitcount:统计值为1的数量
-
- bitpos:查找第一个0或者1所在的位置
-
- bitfield :操作指定位置的值,包含3个子命令:查询、修改、自增
- 查询
- 重新设置一个bitMap
- 命令格式:bitfield key get type offest
- 上图中,bmap这个key在redis中的二进制结果应该是这样的:11100111
- 查询bmap中的前4位,
-
- 命令格式:bitfield key get type offest
- get u4 0
- u:结果以无符号十进制展示(都是正数)
- u4 0:表示从第一位开始数4位,所以拿到的结果是1110,
- 因为是无符号十进制所以左边补0,就是:00000000 00000000 00000000 00001110
转换十进制就是:14
- 因为是无符号十进制所以左边补0,就是:00000000 00000000 00000000 00001110
- u4 0:表示从第一位开始数4位,所以拿到的结果是1110,
- u:结果以无符号十进制展示(都是正数)
- get i4 0
- i:结果以有符号十进制展示(第一位,为1是负数,为0是正数)
- i4 0:表示从第一位开始数4位,所以拿到的结果是1110,
- 因为是有符号十进制所以左边补1(因为拿到的第一位是1),就是:
11111111 11111111 11111111 11111110,转换十进制就是:-2
- 因为是有符号十进制所以左边补1(因为拿到的第一位是1),就是:
- i4 0:表示从第一位开始数4位,所以拿到的结果是1110,
- i:结果以有符号十进制展示(第一位,为1是负数,为0是正数)
- get u4 0
- 也可以一次执行多个子命令
-
- 重新设置一个bitMap
- 查询
- 修改
- 设置一个新的key
-
- 因为a对应的ASCII码是97,那么二进制就是:01100001
- 命令格式:bitfield key set type offest value
- set u8 0 98
- 从第1个位开始,将接下来8个位,用无符号数98 ( 字母b) 替换
- 自增
- 命令格式:bitfield key incrby type offest increment
-
- incrby u8 0 1:从第1个位开始,将接下来8个位,加1
-
-
incrby u8 0 -1:从第1个位开始,将接下来8个位,减1
2. java
主要方法
@Test
public void testBitmap(){
//1. set
System.out.println(stringRedisTemplate.opsForValue().setBit("bmap2",0,false));
//2. get
System.out.println(stringRedisTemplate.opsForValue().getBit("bmap2",0));
//3. bitField
System.out.println(stringRedisTemplate.opsForValue().bitField("bmap2",
// get u8 0
BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(8)).valueAt(0)));
}
3. 使用场景
登录统计功能,
需求:统计某个用户一年内登录网站的情况,使用:[用户id] + [年份]作为key,
用户在2022-01-01登录,就执行:setbit login_[用户id]_2022 0 1
用户在2022-01-05登录,就执行:setbit login_[用户id]_2022 4 1
以此类推。
最后使用 bitcount,就可以统计用户2022年登录的天数