额外加餐-关于使用bitmap来解决缓存穿透的方案

[外链图片转存中…(img-OyLw7puy-1712760065604)]

代码

UserController

@GetMapping("/sign/count")
public Result signCount(){
    return userService.signCount();
}

UserServiceImpl

@Override
public Result signCount() {
    // 1.获取当前登录用户
    Long userId = UserHolder.getUser().getId();
    // 2.获取日期
    LocalDateTime now = LocalDateTime.now();
    // 3.拼接key
    String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
    String key = USER_SIGN_KEY + userId + keySuffix;
    // 4.获取今天是本月的第几天
    int dayOfMonth = now.getDayOfMonth();
    // 5.获取本月截止今天为止的所有的签到记录,返回的是一个十进制的数字 BITFIELD sign:5:202203 GET u14 0
    List<Long> result = stringRedisTemplate.opsForValue().bitField(
            key,
            BitFieldSubCommands.create()
                    .get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0)
    );
    if (result == null || result.isEmpty()) {
        // 没有任何签到结果
        return Result.ok(0);
    }
    Long num = result.get(0);
    if (num == null || num == 0) {
        return Result.ok(0);
    }
    // 6.循环遍历
    int count = 0;
    while (true) {
        // 6.1.让这个数字与1做与运算,得到数字的最后一个bit位  // 判断这个bit位是否为0
        if ((num & 1) == 0) {
            // 如果为0,说明未签到,结束
            break;
        }else {
            // 如果不为0,说明已签到,计数器+1
            count++;
        }
        // 把数字右移一位,抛弃最后一个bit位,继续下一个bit位
        num >>>= 1;
    }
    return Result.ok(count);
}
11.4 额外加餐-关于使用bitmap来解决缓存穿透的方案

回顾缓存穿透

发起了一个数据库不存在的,redis里边也不存在的数据,通常你可以把他看成一个攻击

解决方案:

  • 判断id<0

  • 如果数据库是空,那么就可以直接往redis里边把这个空数据缓存起来

第一种解决方案:遇到的问题是如果用户访问的是id不存在的数据,则此时就无法生效

第二种解决方案:遇到的问题是:如果是不同的id那就可以防止下次过来直击数据

相关推荐

  1. 额外-关于使用bitmap解决缓存穿透方案

    2024-04-28 00:04:01       81 阅读
  2. 缓存穿透、击穿、雪崩解决方法

    2024-04-28 00:04:01       31 阅读
  3. Redis缓存穿透缓存雪崩和缓存击穿解决方案

    2024-04-28 00:04:01       33 阅读
  4. 缓存穿透问题与解决方案

    2024-04-28 00:04:01       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-28 00:04:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-28 00:04:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-28 00:04:01       87 阅读
  4. Python语言-面向对象

    2024-04-28 00:04:01       96 阅读

热门阅读

  1. tvm的常见op

    2024-04-28 00:04:01       110 阅读
  2. Linux--线程

    2024-04-28 00:04:01       35 阅读
  3. 商用清洁机器人的工作原理介绍

    2024-04-28 00:04:01       34 阅读
  4. C语言:实现N的阶乘

    2024-04-28 00:04:01       32 阅读
  5. FPGA verilog 模板设计示例(持续更新)

    2024-04-28 00:04:01       26 阅读
  6. leetcode热题HOT 32. 最长有效括号

    2024-04-28 00:04:01       35 阅读
  7. uniapp步骤条 组件

    2024-04-28 00:04:01       34 阅读
  8. Ansible工具的初步使用

    2024-04-28 00:04:01       29 阅读
  9. LeetCode解法汇总377. 组合总和 Ⅳ

    2024-04-28 00:04:01       32 阅读
  10. 第29篇 分布式网站

    2024-04-28 00:04:01       22 阅读
  11. Rust 实战练习 - 11. Rust异步的基石 tokio

    2024-04-28 00:04:01       30 阅读