Redis 系列09--Redis BitMap

上一篇: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
        • c62f6328be983f69172e09e330e4ca0d.png
        • 上图中,bmap这个key在redis中的二进制结果应该是这样的:11100111
        • 查询bmap中的前4位,
        • ad13c5aef07ed2d677d47b93d70b898f.png

        • 命令格式:bitfield key get type offest
          • get u4 0
            • u:结果以无符号十进制展示(都是正数)
              • u4 0:表示从第一位开始数4位,所以拿到的结果是1110,
                • 因为是无符号十进制所以左边补0,就是:00000000 00000000 00000000 00001110
                  转换十进制就是:14
          • get i4 0
            • i:结果以有符号十进制展示(第一位,为1是负数,为0是正数)
              • i4 0:表示从第一位开始数4位,所以拿到的结果是1110,
                • 因为是有符号十进制所以左边补1(因为拿到的第一位是1),就是:
                  11111111 11111111 11111111 11111110,转换十进制就是:-2
        • 也可以一次执行多个子命令
  • 修改
    • 设置一个新的key
    • 因为a对应的ASCII码是97,那么二进制就是:01100001
    • dbf90ae62b640e0767d0ea9fedcc4569.png
    • 命令格式: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年登录的天数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值