Redis中缓存穿透、缓存击穿、缓存雪崩的详解

如何理解Redis缓存的穿透、击穿、雪崩问题:

缓存穿透

是指缓存中和数据库中都没有数据,而用户不断访问,导致这个不存在的数据每次请求都要到存储层去查询,这样失去了意义。

缓存穿透的解决方案有哪些?

  • 缓存null值
  • 布隆过滤
  • 增强id的复杂度,避免被猜测id规律
  • 做好数据的基础格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

讲一讲布隆过滤

布隆过滤器的特点:

容器角度:

  • 如果布隆过滤器判断结果为元素存在,那么该元素实际上元素不一定会存在,由于哈希碰撞,所以会存在一定误判率。
  • 如果布隆过滤器判断结果为元素不存在,那么他就一定不存在,因为无论哈希碰撞啥的,只要该元素计算出下标值对应数组元素值为0,那么该元素就必定不存在。
  • 布隆过滤器是不支持删除元素的,因为如果位图的某个位被多个元素占用着,那么如果删除其中一个元素是否能将该位置0能,置0的话会影响到其他元素,不置0就等于没删除。

元素角度:

  • 如果元素实际不存在,布隆过滤器可能判断存在。
  • 如果元素实际存在,布隆过滤器一定判断存在。

利用第二个特性,我们就能解决持续从数据库查询不存在的值的问题,把要查询的值先过布隆过滤器,判断是否存在,存在就走redis缓存,不存在就直接返回,并且配合缓存空值,可以有效解决缓存穿透问题,虽然存在一定误差,但是在业务范围内允许接受。

  • 第一步先查询数据库数据并加入到布隆过滤器中。
  • 请求发送过来布隆过滤器判断是否命中,命中就走缓存,之后接着看是否走数据库还是直接从缓存获取返回。
  • 如果布隆过滤器miss,就直接返回,不走cache了。

缓存击穿

是缓存中没有数据,而数据库中有数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大。

|------|----------------------------|---------------------------|
| 解决方案 | 优点 | 缺点 |
| 互斥锁 | * 没有额外的内存消耗 * 保证一致性 * 实现简单 | * 线程需要等待,性能受影响 * 可能有死锁风险 |
| 逻辑过期 | * 线程无需等待。性能较好 | * 不保证一致性 * 有额外内存消耗 * 实现复杂 |

缓存雪崩

就是同一时间内,大量的缓存key值同时失效或者redis服务器宕机,导致大量的请求到达数据库,带来巨大的压力

解决方案

​​​​​​​

1. 合理设置缓存过期时间

  • 避免大量缓存数据同时过期,可以设置缓存的过期时间为随机值,或者在缓存集中到期之前提前对热点数据进行预热,将热点数据提前加载到缓存中。

2. 使用多级缓存

  • 将缓存数据分散到不同的缓存节点或缓存服务器中,以减少缓存集中到期的风险。可以结合本地缓存、分布式缓存等方式来实现多级缓存。

3. 限流和熔断

  • 对请求进行限流处理,避免大量请求同时涌入数据库。可以使用限流算法(如令牌桶、漏桶算法)对请求进行限制。同时,可以设置熔断机制,在检测到系统异常时暂时屏蔽部分请求,以保护数据库免受过载。

4. 数据库优化

  • 提高数据库的处理能力和稳定性,可以采用数据库集群、读写分离、垂直拆分等方式来优化数据库架构,提高数据库的负载能力。
相关推荐
JosieBook14 分钟前
【Spring Boot】Spring Boot调用 WebService 接口的两种方式:动态调用 vs 静态调用 亲测有效
java·spring boot·后端
a程序小傲16 分钟前
京东Java面试被问:Spring拦截器和过滤器区别
java·面试·京东云·java八股文
潮流coder43 分钟前
vscode修改缓存保存路径
ide·vscode·缓存
2401_871260021 小时前
Java学习笔记(二)面向对象
java·python·学习
是梦终空2 小时前
计算机毕业设计252—基于Java+Springboot+vue3+协同过滤推荐算法的农产品销售系统(源代码+数据库+2万字论文)
java·spring boot·vue·毕业设计·源代码·协同过滤算法·农产品销售系统
丿BAIKAL巛2 小时前
Java前后端传参与接收全解析
java·开发语言
cc蒲公英2 小时前
javascript有哪些内置对象
java·前端·javascript
guslegend2 小时前
Spring AOP高级应用与源码剖析
java
Rover.x2 小时前
head table is mandatory
java·apache
yanghuashuiyue2 小时前
Java过滤器-拦截器-AOP-Controller
java·开发语言