Redis缓存击穿、缓存雪崩、缓存穿透

缓存击穿(某个热点key缓存失效)

  • 概念
    • 缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大
    • 和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key
  • 预防
    • 设置热点数据不过期
    • 定时任务定时更新缓存
    • 设置互斥锁
  • SpringCache解决方案
    • 缓存的同步sync
    • sync可以指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中
@Cacheable(value = "user:page", keyGenerator = "keyGenerator", cacheManager = "redisCacheManager1Hour", sync = true)
public Map<String, Object> page(Integer pageNum, Integer pageSize) {
   
    Map<String, Object> map = new HashMap<>();

    Page<User> page = new Page<>(pageNum, pageSize);
    Page<User> listPage = this.userMapper.selectPage(page, null);

    map.put("totalRecord", listPage.getTotal());
    map.put("totalPage", listPage.getPages());
    map.put("list", listPage.getRecords());
    return map;
}

缓存雪崩(多个热点key失效)

  • 概念
    • 大量的key设置了相同的过期时间,导致缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩
  • 预防
    • 存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
    • 设置热点数据永远不过期,定时任务定时更新
  • SpringCache解决方案
    • 设置差别的过期时间,比如cacheManager配置多个过期时间维度
    • 配置文件time-to-live配置
spring:
  redis:
    host: 192.168.1.12
    port: 6379
    password: 123456
  cache:
    # 使用的缓存类型
    type: redis
    redis:
      # 过期时间单位毫秒
      time-to-live: 36000
      # 开启前缀,默认true
      use-key-prefix: true
      # 键的前缀
      key-prefix: gen
      # 是否缓存空结果,防止缓存穿透,默认true
      cache-null-values: true

缓存穿透(查询不存在数据)

  • 概念
    • 查询一个不存在的数据,由于缓存是不命中的,并且出于容错考虑,如发起id为“-1”不存在的数据
    • 如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。存在大量查询不存在的数据,可能DB就挂掉了,这也是黑客利用不存在的key频繁攻击应用的一种方式
  • 预防
    • 接口层增加校验,数据合理性校验
    • 缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,设置短点的过期时间,防止同个key被一直攻击
  • SpringCache解决方案
    • 空结果也缓存,默认不配置condition或者unless就行

相关推荐

  1. Redis缓存击穿缓存雪崩缓存穿透

    2024-01-04 14:06:12       33 阅读
  2. Redis中的缓存雪崩缓存击穿缓存穿透问题

    2024-01-04 14:06:12       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-04 14:06:12       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-04 14:06:12       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-04 14:06:12       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-04 14:06:12       20 阅读

热门阅读

  1. SSD的控制器架构

    2024-01-04 14:06:12       37 阅读
  2. Android 使用 retrofit2 解析XML响应

    2024-01-04 14:06:12       39 阅读
  3. uView Form 表单

    2024-01-04 14:06:12       43 阅读
  4. 15.bash shell中自定义命令行选项与getopt/getopts

    2024-01-04 14:06:12       40 阅读
  5. Linux软链接的创建,删除,修改

    2024-01-04 14:06:12       39 阅读
  6. Mysql数据库:select from语句详解

    2024-01-04 14:06:12       29 阅读
  7. oj 1.9编程基础之顺序查找 06:笨小猴

    2024-01-04 14:06:12       31 阅读
  8. html引入ECharts的两种方式

    2024-01-04 14:06:12       43 阅读
  9. Linux系统启动时汇编指令

    2024-01-04 14:06:12       36 阅读
  10. 安全防御之身份鉴别技术

    2024-01-04 14:06:12       36 阅读
  11. 修改 Ubuntu 的配置

    2024-01-04 14:06:12       37 阅读