【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存击穿和雪崩、限流

简介: 【5月更文挑战第15天】本文介绍了如何解决缓存击穿和雪崩问题。对于缓存击穿,采用singleflight模式,确保即使热点数据导致大量请求未命中缓存,也只允许一个请求真正查询数据,其他请求等待其结果。对于缓存雪崩,解决方案是在设置过期时间时添加随机偏移量,避免所有数据同时过期。偏移量应与过期时间成正比。此外,限流也是一个重要策略,可以在服务层和数据库层实施,以限制请求流量,保护数据库免受高并发压力。

解决缓存击穿

解决缓存击穿拾很容易的,只需要用到我们在缓存模式里面提到的singleflight模式。也就是说,就算是一个热点数据,当几百个请求缓存未命中的时候,在singleflight模式下,也只有一个请求会真的去查询数据,剩下的都在等着这个请求查询回来的结果。
2024-05-18-21-15-59-image.png

解决缓存雪崩

缓存雪崩也很容易解决,之所以有雪崩,就是因为一次性加载了一大批数据放到了这个缓存里面,并且设置了同样的过期时间。

那么解决思路自然就有两个,一个是不允许一次性加载一大批数据到缓存,而这显然不现实,因为批量加载属于业务要求;另外一个思路就是设置不同的过期时间。

最简单的思路就是在过期时间的基础上增加一个偏移量。

要解决缓存雪崩,就是在数据批量加载到缓存的场景中在过期时间的基础上加一个随机量。比如,我预计这一批数据的过期时间是15分钟。那么我就在设置每一条数据的过期时间的时候,在15分钟的基础上加一个0~180秒的偏移量。那么这一批数据就不会在同一时刻过期,也就不存在缓存雪崩的问题了。

这时候,面试官可能会问你这个偏移量的范围怎么确定。比如说在你的回答里面,你说的是 0~180 秒的偏移量,那么 0~10 秒的偏移量行不行?这时候你要抓住核心,偏移量要跟过期时间成正比,不能过低或者过高。

这个随机偏移量应该和过期时间成正比。比如说如果过期时间是15分钟,那么随机偏移量在0~180秒都可以。如果数据量不多,那么0~60秒也可以。而如果过期时间很长,比如4个小时,也可以把偏移量控制在0~10分钟。如果过期时间很短,比如只有10秒,这个偏移量就需要控制在0~3秒内了。

当然,偏移量这个东西,除了随机生成,也可以有别的算法。比如说第一条数据加上 1 秒偏移量,第二条数据加上 2 秒,以此类推

限流

引发缓存穿透、击穿和雪崩等问题的一个关键是有很多请求落到了数据库上。一个最简单的方法就是限制住这些请求,不让他们落到数据库上,限流就可以用在这些场景。

你可以问答限流的基本思路。

缓存穿透和击穿只有在高并发下才会成为一个问题,所以一个很自然的想法就是使用限流。限流可以考虑在两个地方用:服务层面和数据库层面。

在服务层面上限流,是有一个隐含假设的,可以强调一下这个假设,就是数据库撑得住

在服务层面上限流的时候,要保证只要QPS没有超过这个数值,就算所有的请求都命中缓存,直接落到了数据库上,数据库也能撑得住这个流量,但是有些时候也难以保证。或者说大多数人在考虑限流阈值,包括使用压测来确定限流阈值的时候,都已经把命中缓存这种情况考虑进去了。所以需要进一步考虑数据库层面上的限流了。
2024-05-18-23-07-51-image.png

为了防止数据库崩溃,最好在数据库访问上加一些限流措施。显然,就算数据库没有崩溃,这个限流还是可以保护数据库免遭大流量的冲击。

数据库层面上的限流总的来说是必不可少的。不管是缓存崩溃,还是穿透或者击穿,限流都能保护住数据库。如果使用了数据库代理,并且这些代理支持限流,那么就可以直接在代理上做限流。如果没有使用代理或者代理不支持,那么就可以考虑在 ORM 上做。

#

目录
相关文章
|
1月前
|
存储 缓存 监控
缓存击穿、缓存穿透、缓存雪崩 3大问题,如何彻底解决?
【10月更文挑战第8天】在分布式系统中,缓存的使用极大地提高了系统的性能和响应速度。然而,缓存击穿、缓存穿透和缓存雪崩是三个常见的缓存相关问题,它们可能导致系统性能下降,甚至引发系统崩溃。本文将深入探讨这三个问题的成因、影响以及彻底的解决方案。
75 1
|
1月前
|
缓存 NoSQL 关系型数据库
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
本文深入探讨了Redis缓存的相关知识,包括缓存的概念、使用场景、可能出现的问题(缓存预热、缓存穿透、缓存雪崩、缓存击穿)及其解决方案。
183 0
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
1月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
53 2
|
1月前
|
存储 缓存 NoSQL
深入理解后端缓存机制的重要性与实践
本文将探讨在后端开发中缓存机制的应用及其重要性。缓存,作为提高系统性能和用户体验的关键技术,对于后端开发来说至关重要。通过减少数据库访问次数和缩短响应时间,缓存可以显著提升应用程序的性能。本文将从缓存的基本概念入手,介绍常见的缓存策略和实现方式,并通过实例展示如何在后端开发中有效应用缓存技术。最后,我们将讨论缓存带来的一些挑战及其解决方案,帮助您在实际项目中更好地利用缓存机制。
|
2月前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
72 2
|
2月前
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
|
2月前
|
缓存 NoSQL 前端开发
16)缓存雪崩、缓存击穿、缓存穿透
16)缓存雪崩、缓存击穿、缓存穿透
36 0
|
3月前
|
缓存 网络协议 API
【API管理 APIM】APIM中对后端API服务的DNS域名缓存问题
【API管理 APIM】APIM中对后端API服务的DNS域名缓存问题

热门文章

最新文章

下一篇
无影云桌面