Loading... # 缓存雪崩、缓存穿透、缓存击穿 ## 缓存雪崩 某一个时刻出现大规模的缓存失效的情况,导致大量的请求直接打在数据库上,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。 ### 解决方案: 1、在原有的失效时间上加上一个随机值,比如1-5分钟随机。这样就避免了因为采用相同的过期时间导致的缓存雪崩;也可以采用多级缓存 2、给业务降级限流,使用熔断机制。 当流量到达一定的阈值时,就直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。 3、提高数据库的容灾能力,可以使用分库分表,读写分离的策略。 4、为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。 ## 缓存穿透 指客户端请求一个不存在的目标,这样请求永远会打到数据库 ### 解决方案 #### 缓存空对象 - 优点:实现简单,维护方便 - 缺点 - 额外的内存消耗 - 短期的不一致 ![缓存空对象.png](https://cdn2.feczine.cn/2023/04/12/643623e831682.png) #### 布隆过滤 - 优点:内存占用少,没有多余key - 缺点: - 实现复杂 - 存在误判可能 ![布隆过滤.png](https://cdn2.feczine.cn/2023/04/12/643624614c0e1.png) ## 缓存击穿 缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,高并发同时尝试重建缓存(查表),导致并发全部打在数据库上,导致数据库压力剧增。 ### 解决方案 1、逻辑过期,在value中设置过期时间 2、使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。 ![缓存击穿.png](https://cdn2.feczine.cn/2023/07/28/64c2dfdc5482f.png) 参考: 1. [什么是缓存雪崩、缓存击穿、缓存穿透?](https://zhuanlan.zhihu.com/p/346651831) 2. 黑马程序员-Redis 最后修改:2023 年 07 月 28 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 2 本作品采用 CC BY-NC-SA 4.0 International License 进行许可。