• 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. }

  • 相关阅读:
    零基础数据科学学习 Python 的 4 个阶段
    linux安装opencv
    Java函数式编程
    Kotlin高仿微信-第1篇-注册
    R Wordcloud2 库 词云图
    .NET周刊【7月第2期 2024-07-14】
    Dapr学习(4)之eShopOnDapr部署(Rancher2.63&k3s)
    java计算机毕业设计社区疫情防控管理信息系统源程序+mysql+系统+lw文档+远程调试
    心法利器[69] | 聊聊数据敏感性
    题解 [CF1682D] Circular Spanning Tree
  • 原文地址:https://blog.csdn.net/chenkaibsw/article/details/126075045