【Redis】聊一下缓存雪崩、击穿、穿透、预热

news/2025/2/4 4:45:10/

缓存的引入带来了数据读取性能的提升,但是因此也引入新的问题,一个是数据双写一致性,另一个就是雪崩、击穿、穿透,那么如何解决这些问题,我们来说下对应的问题和解决方案

雪崩

缓存雪崩:同一时间内大量请求无法从Redis缓存层获取数据,都将数据请求到数据库层,而导致数据库压力激增。

第一个原因:同一时间内缓存过期,导致无法处理请求

在正常情况下,数据从缓存读取到数据直接返回,但是当大量缓存同时过期时,比如1S内1W个请求从Redis读取不到数据,那么请求就直接打到MySQL中。MySQL负载会过高。
在这里插入图片描述
解决方案
1.通过为不同的key设置不同的过期时间,比如随机1-3分钟,以至于不会出现同一时间内大量key数据失效的情况。
2.保证核心业务数据的请求,非核心业务,直接返回配置化数据。也就是服务降级。

这里就要说一个在之前实际经历过的场景,由于业务人员开发的代码BUG,导致一个慢查询一天只会统计一次,但是由于逻辑问题,导致没有查询缓存,每次请求都直接打到数据库,而这个慢SQL很耗费资源,所以出现数据库负载过高,进一步影响到别的业务。

第二个原因:Redis实例宕机

另一个原因则是出现Redis单点宕机,整个缓存层服务无法使用,那么数据请求直接到数据层。
解决方案
一般来说我们需要对请求进行限流,以及降级的方式来保证核心业务的流转,然后非核心业务,直接降级不处理或者别的额方式。这样比直接全部流量进来之后,整个MySQL负载压力小很多。以及我们需要在搭建Redis时候采用主从架构,如果主机宕机,那么备机需要立马切换成主机。

击穿

雪崩是大量的缓存数据失效,而击穿针对的是某个热点key失效,比如微博热搜,top10 如果数据缓存失效,那么都直接达到数据库,数据库肯定承受不住,对于这种情况我们一般不要设置过期时间,以及采用提前预热的方式。

穿透

穿透是从缓存和数据库中都获取不到数据,如果有大量请求查询,那么对缓存和数据库会带来更大的压力。
在这里插入图片描述
出现的情况,第一要么认为的业务操作,误删除数据和缓存数据,第二个,有人为攻击。
解决方案
1.返回缺省值或者默认值。
2.使用布隆过滤器判断数据是否存在,减轻数据库压力。
3.前端拦截非法请求参数,不请求到数据库。

小结

雪崩是针对大量的缓存失效,而击穿是针对某个热点key,穿透是从数据库中获取不到数据了。
在这里插入图片描述


http://www.ppmy.cn/news/73787.html

相关文章

202305-第二周资讯

山川软件愿为您提供最优质的服务。 您的每一个疑问都会被认真对待,您的每一个建议都将都会仔细思考。 我们希望人人都能分析大数据,人人都能搭建应用。 因此我们将不断完善DEMO、文档、以及视频,期望能在最大程度上快速帮助用户快速解决问…

数云融合|数字化转型中的利器:揭秘云技术的重要角色

数字化转型不仅是一个流行语,而是一项真正能够改变你的业务流程并提高客户参与度的重要战略。要实现数字化转型,必须重新构建业务流程,同时利用AI、物联网、AR、ML、大数据分析等先进技术不断提升客户参与度。这就需要利用云技术提供的强大计…

京东商品详情API调用说明 京东商品库存销量接口

尊敬的开发人员: 感谢您选择使用京东API进行开发。下面为您提供一份简要的API调用说明,帮助您快速上手并实现所需功能。 1.注册京东开放平台账户并创建应用 首先,您需要在 https://o0b.cn/jennif/ 网站上注册一个京东开放平台的账户&#…

Squid 代理服务器

Squid 主要提供缓存加速、应用层过滤控制的功能。 代理的工作机制: 1.代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。 2.将获得的网页数据(静态 Web 元素)保存到缓存中并发送给客户机&#xf…

2023年博客之星入围选拔重装开启——今年没有拉票环节啦

2023年博客之星入围选拔开始啦! 2022的博客之星大赛言犹在耳,2023的活动又接踵而至了。今年的博客之星(包括博客新星)的入围规则很简单: 2023年新规则 1.不需要拉票!不喜欢这个环节的有福啦 2.从年初就…

ROS 开发环境搭建(虚拟机版本)(一)

相关工具,以及镜像(以后有用) 链接:https://pan.baidu.com/s/1xgtp-XGFFNCACV_-0TJO2A 提取码:ar1w 1. 下载vm虚拟机(我选择的官方最新的vm虚拟机),安装好 2.安装百度网盘里面的…

C++系列之类与对象(下)

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 插入和输出流 //流插入不能写成成员函数,因为Date对象默认占用了第…

2023中兴软件类笔试

1.下列Python代码:将近似输出什么? import numpy as np print np.sqrt(6*np.sum(1/np.arange(1,1000000, dtypenp.float)**2))这段代码是用来计算圆周率的巴塞尔问题(Basel problem)的近似值,输出结果将近似为3.14159…