详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断

简介: 详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断

一、介绍

当使用缓存系统(如 Redis)作为后端存储来加速应用程序的读取性能时,可能会遇到一些缓存相关的问题,包括缓存击穿、缓存穿透和缓存雪崩。

二、缓存击穿

缓存击穿(Cache Miss and Hot Key Problem):

缓存击穿是指在高并发的情况下,当某个热门数据的缓存失效时,大量请求直接绕过缓存直接访问后端数据库,导致数据库压力激增。这是因为在缓存失效后,当多个请求同时访问某个热门数据,缓存尚未重新生成,这些请求都会落到数据库上,造成数据库压力瞬间增大。

解决办法:

使用互斥锁或分布式锁:在缓存失效的时候,先获取锁,然后再去数据库查询数据,得到数据后,再将数据写入缓存,并释放锁。其他请求在获取到锁之前会等待,避免大量请求同时访问数据库。

设置短期过期时间:缓存数据可以设置短期的过期时间,避免在热门数据失效期间出现缓存击穿。

三、缓存穿透

缓存穿透(Cache Miss and Not Found Problem):

缓存穿透是指查询一个不存在的数据,由于缓存和数据库都没有相应的数据,每次请求都会穿过缓存直接访问数据库,导致数据库压力增大。

解决办法:

使用布隆过滤器(Bloom Filter):布隆过滤器可以在缓存层面对查询的键进行预先判断,如果不存在,则直接返回,避免穿透到数据库。存在误判,因为有hash冲突,即判断存在,其实不存在,但是如果判断不存在那么一定存在。

缓存null:对于查询不存在的数据,也可以在缓存中设置一个空值占位,避免频繁地访问数据库。

四、缓存雪崩

缓存雪崩(Cache Explosion Problem):

缓存雪崩是指在某个时刻,缓存中大量的数据同时过期失效,导致大量的请求都落到数据库上,造成数据库瞬间压力剧增,甚至导致数据库崩溃。

解决办法:

设置随机过期时间:可以在缓存中设置随机的过期时间,避免大量缓存同时失效。

使用多级缓存:可以设置多级缓存,将缓存分为多个层级,当顶层缓存失效时,可以从其他层级的缓存中获取数据,减少对数据库的直接访问。

实时监控:对缓存过期时间和缓存命中率进行实时监控,及时发现问题并采取相应的措施。

五、写在最后

总结:都是高并发的情况下大量请求打到数据库

问题 描述 解决
缓存击穿 热点key失效 加锁、短期的过期时间
缓存穿透 查询不存在数据 布隆过滤器、缓存null
缓存雪崩 大量缓存同时过期 随机过期时间、多级缓存

如果你觉得这篇文章对你有帮助,希望能得到你的点赞。这是对作者最好的鼓励哦😍

相关文章
|
28天前
|
缓存 监控 NoSQL
redis 缓存穿透 击穿 雪崩 的原因及解决方法
redis 缓存穿透 击穿 雪崩 的原因及解决方法
|
20天前
|
存储 缓存 NoSQL
应对危机如何处理缓存击穿风险
【6月更文挑战第9天】本文介绍如何应对缓存穿透,这可以通过限制IP访问次数、预热缓存、设置空值以及使用布隆过滤器来过滤非法请求。布隆过滤器占用空间小,有误判率但速度快,适用于广告投放、内容推荐和数据库查询等场景。其优点包括低时间复杂度、并行运算和节省空间,但存在误判、无法存储元素及删除操作的局限性。
31 4
应对危机如何处理缓存击穿风险
|
1月前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
【5月更文挑战第16天】该方案提出了解决Redis缓存穿透、击穿和雪崩问题的策略。通过使用两个或多个互为备份的Redis集群,确保在单个集群故障时,另一个可以接管。在故障发生时,业务会与备用集群保持心跳检测,并根据业务重要性分批转移流量,逐步增加对备用集群的依赖,同时监控系统稳定性。对于成本敏感的小型公司,可以采用低成本的单机或小规模自建Redis备份。此方案强调渐进式流量转移,以保护系统免受突然压力冲击。
31 1
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
|
22小时前
|
缓存 NoSQL Java
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
5 0
|
1月前
|
存储 缓存 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存穿透
【5月更文挑战第14天】解决缓存穿透问题有两种策略。一是回写特殊值,当数据不存在时,在缓存中存储特殊值以标记,避免下次重复查询数据库。但此方法可能被恶意请求利用,浪费内存。二是使用布隆过滤器,预先判断数据是否存在,减少无效数据库查询。布隆过滤器虽有假阳性可能,但概率低,可接受。此外,可先查缓存再查布隆过滤器,优化正常请求的效率。两种方式各有优劣,实际应用需根据场景选择。
30 3
|
1月前
|
缓存 数据库 算法
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存击穿和雪崩、限流
【5月更文挑战第15天】本文介绍了如何解决缓存击穿和雪崩问题。对于缓存击穿,采用singleflight模式,确保即使热点数据导致大量请求未命中缓存,也只允许一个请求真正查询数据,其他请求等待其结果。对于缓存雪崩,解决方案是在设置过期时间时添加随机偏移量,避免所有数据同时过期。偏移量应与过期时间成正比。此外,限流也是一个重要策略,可以在服务层和数据库层实施,以限制请求流量,保护数据库免受高并发压力。
26 0
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存击穿和雪崩、限流
|
1月前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---缓存穿透、击穿和雪崩
【5月更文挑战第13天】本文讨论了三种常见的缓存问题:穿透、击穿和雪崩。缓存穿透发生时,请求的数据既不在缓存也不在数据库,可能导致数据库崩溃。缓存击穿指数据仅存在于数据库,热点数据的大量未命中请求会压垮数据库。缓存雪崩则是大量缓存在同一时间过期,引发数据库瞬间压力过大。为应对这些问题,需了解Redis部署(如Cluster或Sentinel)、故障恢复策略,以及公司如何保护数据库。解决缓存问题的经验和预防措施是面试中的重要话题。
24 0
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---缓存穿透、击穿和雪崩
|
3天前
|
存储 缓存 NoSQL
redis缓存优化
采用获取一次缓存,如果为空的情况,获取分布式锁,让一个线程去重建缓存,另外的线程未获取到锁的情况,休眠短时间,然后再自旋获取缓存。
11 0
|
8天前
|
缓存 NoSQL Java
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
31 0
|
22小时前
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
7 1