欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 缓存穿透、缓存击穿与缓存雪崩:原因与解决方案

缓存穿透、缓存击穿与缓存雪崩:原因与解决方案

2024/10/25 19:00:15 来源:https://blog.csdn.net/weixin_72648764/article/details/140700568  浏览:    关键词:缓存穿透、缓存击穿与缓存雪崩:原因与解决方案

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主
📌 擅长领域:全栈工程师、爬虫、ACM算法
🔥 微信:zsqtcyw 联系我领取学习资料

🤞缓存穿透、缓存击穿与缓存雪崩:原因与解决方案🤞

    • 🎈前言
    • 🎈缓存穿透
    • 🎈缓存击穿
    • 🎈缓存雪崩
    • 🎈结论
    • 🍚总结

🎈前言

在分布式系统中,缓存作为提升性能的关键组件,扮演着至关重要的角色。然而,随着缓存的广泛使用,也带来了一系列问题,其中最为典型的是缓存穿透、缓存击穿和缓存雪崩。本文将详细探讨这三种问题的原因、表现以及相应的解决方案。

🎈缓存穿透

原因: 缓存穿透是指查询一个数据库一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。用户可能出于恶意,连续请求大量不存在的数据,数据库查询压力激增,导致服务雪崩。

表现

大量查询不存在的数据。
数据库压力骤增。
解决方案

  • 布隆过滤器:布隆过滤器是一种空间效率很高的概率型数据结构,用于判断一个元素是否在一个集合中。在缓存之前加入布隆过滤器,可以快速判断数据是否存在,从而避免对底层存储系统的查询压力。
  • 接口限流与熔断降级:对访问接口进行限流,防止恶意访问导致缓存穿透。同时,当接口访问量激增时,通过熔断降级措施保护系统不受影响。
  • 空值缓存:对于查询结果为空的数据也进行缓存,并设置较短的过期时间,以减少对底层存储系统的查询压力。但需注意,这种方法可能会引入数据一致性问题,需根据实际情况权衡利弊。

🎈缓存击穿

原因: 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

表现

缓存过期瞬间,大量并发请求直接访问数据库。
数据库查询压力激增。
解决方案

  • 设置热点数据永不过期:对于热点数据,可以设置其永不过期,或者设置一个较长的过期时间,避免缓存过期导致的击穿问题。
  • 加互斥锁:在访问缓存之前,通过互斥锁(如Redis的分布式锁)保证同一时间只有一个线程去查询数据库,其他线程等待,查询到的数据再放入缓存中,其他线程从缓存中获取数据。这种方法虽然增加了代码的复杂度,但可以有效避免缓存击穿问题。
  • 双缓存策略:准备两个缓存,缓存A和缓存B。A的过期时间较短,B的过期时间较长。当A过期后,通过异步方式去加载数据,并更新到缓存B。这样,在A过期到B加载完成的这段时间内,系统可以访问缓存B,从而避免缓存击穿。

🎈缓存雪崩

原因: 缓存雪崩是指缓存中大量数据同时过期或者缓存服务宕机,导致大量请求直接访问数据库,数据库查询压力激增,引起服务雪崩。

表现
大量缓存数据同时过期。
数据库查询压力激增,系统响应缓慢或崩溃。
解决方案

  • 缓存数据过期时间设置随机:避免大量缓存数据同时过期,可以在设置缓存过期时间时加入随机因子,使得缓存过期时间分散开来。
  • 依赖降级组件:对缓存数据的获取依赖降级组件,当缓存服务不可用或响应时间过长时,可以直接返回降级数据,避免对数据库造成过大压力。
  • 服务熔断与限流:当数据库查询压力达到阈值时,触发服务熔断机制,拒绝部分请求,保护系统不被压垮。同时,对访问接口进行限流,防止请求量过大导致服务雪崩。
  • 多级缓存架构:构建多级缓存架构,如本地缓存+分布式缓存,当分布式缓存服务不可用时,可以回退到本地缓存,减少直接访问数据库的频率。

🎈结论

缓存穿透、缓存击穿和缓存雪崩是分布式系统中常见的缓存问题,对系统的稳定性和性能有着重要影响。通过合理的策略和技术手段,我们可以有效地预防和解决这些问题,确保系统在高并发场景下依然能够稳定运行。在实际应用中,应根据业务场景和需求,灵活选择和组合不同的解决方案,以达到最佳效果。

🍚总结

大功告成,撒花致谢🎆🎇🌟,关注我不迷路,带你起飞带你富。
作者:码海浮生

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com