当前位置: 首页 > news >正文

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.12port: 6379password: 123456cache:# 使用的缓存类型type: redisredis:# 过期时间单位毫秒time-to-live: 36000# 开启前缀,默认trueuse-key-prefix: true# 键的前缀key-prefix: gen# 是否缓存空结果,防止缓存穿透,默认truecache-null-values: true

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

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

相关文章:

  • 【PCB专题】Allegro封装更新焊盘
  • ES6之Reflect详解
  • 文件监控-IT安全管理软件
  • 达梦数据库安装超详细教程(小白篇)
  • 复试 || 就业day09(2024.01.04)算法篇
  • Win10电脑关闭OneDrive自动同步的方法
  • linux(centos)相关
  • 外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南
  • Java:HeapMemory和DirectMemory配置与使用介绍
  • 记 -bash: docker-compose: command not found 的问题解决
  • 分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析
  • Ubuntu 24.04 Preview 版安装 libtinfo5
  • Spring AOP<一>简介与基础使用
  • react ant tree节点没有children也会显示展开框 节点有children却不显示展开框
  • 【Linux】进程查看|fork函数|进程状态
  • LeetCode第98题 - 有效的括号
  • Nacos学习思维导图
  • 新视野英语课本复盘1
  • Sentinel整合OpenFeign
  • PyTorch实战:基于Seq2seq模型处理机器翻译任务(模型预测)
  • stm32学习总结:5、Proteus8+STM32CubeMX+MDK仿真串口并使用串口打印日志(注意重定向printf到串口打印的问题)
  • SAFe大规模敏捷企业级实训
  • 中医电子处方系统,西医个体诊所门诊卫生室病历记录查询软件教程
  • 搞定ESD(八):静电放电之原理图设计
  • 微前端 Micro App
  • Java amr格式转mp3格式
  • Vue2面试题:说一下虚拟DOM的原理?
  • Spring对bean的管理
  • Character Controller Smooth
  • 企业内训系统源码开发实战:搭建实践与经验分享