• Redis学习笔记—常见应用场景—BitMap


     

     

     

    补充说明redis中用int来修饰len字段,int为4个字节,也就是32位,那么最大能表示2^32次方。所以2^32/8/1024/1024=512m, 修饰len字段也可以是64个字节,但此时太大违背redis的设计初衷

     GETBIT只能一次查一个值  BITFIELD一次可以查多个值

     签到功能:

     示例:

    1. @Override
    2. public Result sign() {
    3. //1.获取用户登录
    4. Long userId = UserHolder.getUser().getId();
    5. //2.获取日期
    6. LocalDateTime now = LocalDateTime.now();
    7. //3.拼接这个key
    8. String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
    9. String key = "sign:" + userId + keySuffix;
    10. //4.获取今天是本月的第几天
    11. int dayOfMonth = now.getDayOfMonth();
    12. //5.写入redis setbit key offset 1
    13. redisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
    14. return Result.ok();
    15. }

     

     

     签到,设置该位bit为1:

    1. public Result sign() {
    2. //1.获取用户登录
    3. Long userId = UserHolder.getUser().getId();
    4. //2.获取日期
    5. LocalDateTime now = LocalDateTime.now();
    6. //3.拼接这个key
    7. String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
    8. String key = "sign:" + userId + keySuffix;
    9. //4.获取今天是本月的第几天
    10. int dayOfMonth = now.getDayOfMonth();
    11. //5.写入redis setbit key offset 1
    12. redisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
    13. return Result.ok();
    14. }

     查询一个月中的连续签到:

    1. public Result signCount() {
    2. //1.获取用户登录
    3. Long userId = UserHolder.getUser().getId();
    4. //2.获取日期
    5. LocalDateTime now = LocalDateTime.now();
    6. //3.拼接这个key
    7. String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
    8. String key = "sign:" + userId + keySuffix;
    9. //4.获取今天是本月的第几天
    10. int dayOfMonth = now.getDayOfMonth();
    11. //5.获取本月截止今天为止返回的所有签约记录,是一个十进制的数字
    12. List result = redisTemplate.opsForValue().bitField(
    13. key,
    14. BitFieldSubCommands.create()
    15. .get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth))
    16. .valueAt(0)
    17. );
    18. if(result == null || result.isEmpty()){
    19. return Result.ok(0);
    20. }
    21. Long num = result.get(0);
    22. if(num == null || num == 0){
    23. return Result.ok(0);
    24. }
    25. //6.循环遍历
    26. int count = 0;
    27. while ((num & 1) != 0) {
    28. count++;
    29. num = num >>> 1;
    30. }
    31. return Result.ok(count);
    32. }

  • 相关阅读:
    萤石网络发布家用及商用清洁机器人 积极布局具身智能
    MongoDB数组查询
    Mysql多表设计
    stack, queue 模拟与用法
    Pytorch学习笔记(8)——在序列标注等多维数据上如何使用交叉熵
    【工具类】阿里域名关联ip(python版)
    化工原理 --- 热量传递(补充)
    24 DRF详细学习篇章一|Requests|Responses|View|Routers
    qt 简单实验 画一个等边三角形
    Hundred Finance 攻击事件分析
  • 原文地址:https://blog.csdn.net/chenkaibsw/article/details/126075045