【5分钟背八股】击穿、穿透、雪崩、预热解决方案?

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决方案

有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存击穿

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。

缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方案

缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。这里分享一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

缓存雪崩

缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

解决方案

1.使用互斥锁(mutex key)
业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。在redis2.6.1之前版本未实现setnx的过期时间

2."提前"使用互斥锁(mutex key):
在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中。

3."永远不过期":
这里的“永远不过期”包含两层意思:

(1) 从redis上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期。

(2) 从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期

从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。

总结

穿透:缓存不存在,数据库不存在,高并发,少量key

击穿:缓存不存在,数据库存在,高并发,少量key

雪崩:缓存不存在,数据库存在,高并发,大量key

语义有些许差异,但是,都可以使用限流的互斥锁,保障数据库的稳定


【5分钟背八股】25:击穿、穿透、雪崩、预热解决方案?.png

解说学习【5分钟背八股】redis缓存如何回收?

#2022春招#
Java八股文 文章被收录于专栏

长期分享Java面试、面经、学习、架构笔记

全部评论

相关推荐

01-08 11:19
已编辑
深圳职业技术学院 护士
我是从大一下学期5月开始转互联网的,原因很简单,对本专业的就业薪资与前景非常不满,而我特别想赚钱,所以选了互联网,而又因为带我的师兄都是前端,所以阴差阳错就做了前端当时的梦想就是进腾讯,进腾讯,进腾讯!大一下学期学了3个月的前端的基础知识后,开始参加学校工作室的考核,当时整个暑假都没回家,跑去自习室和考研的同学坐一下,那段时间我敢说我去的比大多数人早,走的比大多数人晚,把所有的时间精力都扑在做工作室考核上面,不过结果非常遗憾,我竞争不过两个超级大神,最后进不去了(广工的anyview是我一身之痛)不过进了物理学院的软件组,有了自己的工位还有好多转码师兄的指导后,开始长达半年的实验室之旅......在这半年,我几乎没有上课,没有去哪里玩,我像一个被写了程序的机器人一样,7点半起床,去实验室学前端,一直到晚上10点 11点。我太笨了,太笨了,学东西太慢了,coderwhy的网课看了一遍又一遍,项目代码写了一遍又一遍,红宝书也是一遍一遍的看......就这样,过完了这打了鸡血的半年,寒假也只回去十天左右,然后就到了24年的3月我开始焦虑,非常非常的焦虑与害怕,因为我开始刷牛客了,开始去网上了解各种就业信息,一大堆负面信息朝我涌来,我不知道怎么区分就全盘接收前端已死,互联网完蛋了,非科班别想了,双非别想了,没有学历就等于判了死刑......有半个月我半夜都会被吓醒,后面想到的一个破局之路就是刷实习,大量的堆实习,弥补我双非的学历,非科班的专业带来的巨大劣势于是开始转战图书馆,找了考研的人一起坐,他们什么时候去我就什么时候去,开始背八股,前端三件套,框架,工程化,算法,计算机网络......这些对我当时的我来说太多了太多了,也太难太难了,越看越焦虑,越焦虑我越不敢停下来,每天晚上都要去跑5公里来让自己平静下来就这样过了一个多月,我准备的七七八八开始投实习了,第一次面试,我整个人紧张的止不住的颤抖,喝了一杯又一杯的水,上了一次又一次的厕所,皇天不负有心人,在四月底找到了自己的第一份外包实习,很大程度地缓解了我的焦虑,回去休息了半个月五一后入职,实习了一个星期左右,感觉太难受了,工作氛围及其压抑,同事也是感觉都乱来的,而且喜欢打压我,我在写算法的时候,他们老说不用写这个,这些是大厂才要的,你又进不去大厂...... 后面我只能偷偷跑楼下写,过了小半个月我实在呆不下去就离职回学校了,第一段实习就这样结束了,而且老板不给我发工资......于是我开始在学校二次沉淀了,开始大量刷leetcode 代码随想录 codetop 准备更强的项目 更深入地背八股,于是一直学啊学啊,那个暑假就回去两个星期学车,其他时间都呆在学校的实验室里24年8月开始全面投实习,拿了古茗 卓望数码的offer,本来打算去杭州古茗的,结果美团打电话说面试通过,阴差阳错地去了上海美团,开启了自己的第一段实习刚去没多久,还没适应那里的生活工作环境,学校传来噩耗,外出实习被抓到了,老师逼我回去,说不回去毕不了业,我当时听完电话后,整个人崩溃了,我跑去公司楼道间一直哭,我不甘心,我太不甘心了,我不甘心来之不易的实习泡汤,幸好后面申请了一门实验课重修,如愿留在上海于是就在上海美团实习了四个月,一直到了25年1月,我开始飘了,我感觉自己牛逼坏了,感觉美团平台不够高,想去更高的腾讯和字节,放弃了美团核心部门,而且高转正率的机会,选择了离职,当时还在牛客写了一篇长文于是回家休息到年后,2月多开始回学校全力准备暑期实习,一直面一直挂,直到5月份才找到字节的实习,这三个月是我最痛苦最煎熬的日子,我的自信心被不断的击碎,一直面一直挂,而身边朋友开始接连上岸,我开始怀疑自己,开始后悔当时的决定,开始觉得自己就是一个看不清自己的傻逼然后呢,4月底 在没招了,万念俱灰的时候,字节约面试了,一点也不想复习,裸面,结果阴差阳错给我干进去了5月中开始字节的实习,虽然压力比较大,但还可以接受,平平稳稳能干了三个月,自我感觉良好,以为转正稳了,结果到八月初的时候,通知转正失败,当时天都塌了,然后开始找其他部门的机会,后面活水成功,去另一个部门实习了一个月,其实转正概率也不小,但是当时也是心比天高,以为自己牛逼坏了,所以选择离职秋招9月中开始全面秋招,结果大家也知道,秋招大溃败,各种终面挂 hr面挂 排序挂 有时候也不知道为什么挂,问题也都答出来了,算法也都写出来了,但就是挂哈哈哈哈其中很多时间都是在打字节的复活赛,反复仰卧起坐,反复鞭尸,后面感觉面字节跟回家和亲戚聊天一样,他会问什么我都知道,甚至我可以抢答,面完还能聊天开点玩笑......在12月中的时候,字节又约面了,阴差阳错又到了三面,结果还给整挂了,当时确实破防的要死,然后转部门面试,本来打算拒绝的,因为实在太心累,太折磨了,但还是咬咬牙去面了,然后莫名其妙问的也就那些,三面还整了几道脑筋急转弯,本来以为又要挂了,结果过了,据说是因为我的竞争对手三面ai作弊被发现了,所以只面了她16分钟,所以就轮到我了,我也不用hr面直接审批,然后审批半天,隔天直接谈薪,hr开了个我拒绝不了的薪资,而且表达出来的意思是无论其他开多少字节都能match的意思,诚意满满回望这两年多的经历,真的是非常非常感慨,我想和大家说的是每个人都会有属于自己花期,只是时间的问题而已,努力踏实做事,终究会有回报!我也曾在这条路上迷茫、焦虑、崩溃与无助,但我做的唯一的一件事情就是,整理好心情,重新出发,坚持下去,光脚的不怕穿鞋的,拼了兄弟们!
码农索隆:我感觉兄弟你所处在环境已经算是双非中比较好的了,双非院校中很少有实验室,也鲜有师哥师姐会带着去学习,而你也很争气抓住了这次机会,一飞冲天
现在前端的就业环境真的很...
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务