Redis击穿穿透雪崩产生原因分析及解决思路面试
来源:脚本之家
时间:2022-12-31 09:44:04 323浏览 收藏
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Redis击穿穿透雪崩产生原因分析及解决思路面试》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~
1、前言
大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下,比如当缓存中某一个热点key失效。
2、问题起因
有两个主要原因:
- 1、Key过期;
- 2、Key被页面置换淘汰。
对于第一个原因是因为在Redis中,Key有过期时间,如果某一个时刻(假如商城做活动,零点开始)key失效,那么零点之后对某一个商品查询请求将全都压到数据库上,导致数据库崩。
对于第二个原因,因为内存是有限的,要时时刻刻缓存新的数据,淘汰旧的数据,所以在一定的页面置换策略(常见页面置换算法图解)中,淘汰数据,如果某些商品做活动之前无人问津,势必会被淘汰。
3、应对击穿的处理思路
正常的处理请求如图:
由于key过期在所难免,高流量来到Redis时,根据Redis的单线程特性,可以认为任务是在队列里依次执行的,当请求到达Redis发现Key过期时,进行一个操作:设置锁。
这个流程大概如下:
- 请求到达Redis,发现Redis Key过期,查看有没有锁,没有锁的话回到队列后面排队
- 设置锁,注意,这儿应该是setnx(),而不是set(),因为可能有其他线程已经设置锁了
- 获取锁,拿到锁了就去数据库取数据,请求返回后释放锁。
但是引出了一个新的问题,如果拿到锁去拿数据的请求然后挂了怎么办?也就是锁没有释放,其他进程都在等锁,解决办法是:
对锁设置一个过期时间,如果到达了过期时间还没释放就自动释放,问题又来了,锁挂了好说,但是如果是锁超时呢?也就是在设定的时间里数据没有取出来,但是锁由过期了,常见的思路是,锁过期时间值递增,但是想想不靠谱,因为第一个请求可能超时,如果后面的也超时呢,接连多次超时之后,锁过期时间值势必特别大了,这样做弊端太多。
另外一个思路是,再开启一个线程,进行监控,如果取数据的线程没有挂的话,就适当延迟锁的过期时间。
4、穿透
穿透主要原因是很多请求都在访问数据库不存在的数据,例如一个卖书的商城一直被请求查询茶叶产品,由于Redis缓存主要是用来缓存热点数据,对于数据库都不存在的数据,是没法缓存的,这种异常流量就会直接到达数据库并且返回"没有"的查询结果。
应对这种请求,处理办法是对访问请求加一层过滤器,例如布隆过滤器、增强版布隆过滤器、布谷鸟过滤器。
除了布隆过滤器,可以增加一些参数检验,例如数据库数据id一般都是递增的,如果请求 id = -10 这种参数,势必绕过Redis,避免这种情况,可以对用户真实性检验等操作。
5、雪崩
雪崩,和击穿类似,不同的是击穿是一个热点Key某时刻失效,而雪崩是大量的热点Key在一瞬间失效,网络上很多博客都在强调解决雪崩的策略是随机过期时间,这个非常不准确,举个例子,银行做活动,之前这个利息系数为2%,过了零点系数改为3%,这种情况能将用户的对应的key改为随机过期吗?如果用的过去的数据叫脏数据。
明显不可以,同样存钱f0c;你存到年底利息300万,隔壁才200万,这不得打架啊,开玩笑~
正确的思路是,首先要看看这个Key过期是不是时点性有关,时点性无关的话,可以随机过期时间解决。
如果是时点性有关,例如刚刚说的银行某一天改变某系数,那么就要利用强依赖击穿方案,策略是先过去的线程更新一下所有key。
在后台更新热点key的同时,业务层将进来的请求延时一下,例如短暂的睡几毫秒或者秒,给后面的更新热点key分散压力。
结束
终于介绍完啦!小伙伴们,这篇关于《Redis击穿穿透雪崩产生原因分析及解决思路面试》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布数据库相关知识,快来关注吧!
-
132 收藏
-
207 收藏
-
368 收藏
-
342 收藏
-
361 收藏
-
159 收藏
-
164 收藏
-
221 收藏
-
156 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 活泼的帽子
- 好细啊,已收藏,感谢作者大大的这篇博文,我会继续支持!
- 2023-04-08 21:48:40
-
- 糟糕的唇彩
- 这篇文章真是及时雨啊,很详细,受益颇多,码住,关注up主了!希望up主能多写数据库相关的文章。
- 2023-03-03 09:15:41
-
- 直率的小松鼠
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享技术贴!
- 2023-02-28 08:00:16
-
- 光亮的滑板
- 这篇博文真及时,太全面了,太给力了,码起来,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-02-26 19:42:54
-
- 天真的玉米
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢师傅分享文章!
- 2023-01-23 16:30:26
-
- 火星上的火龙果
- 这篇博文出现的刚刚好,太全面了,很有用,已收藏,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-01-13 21:51:51
-
- 清秀的老鼠
- 这篇文章真是及时雨啊,太细致了,受益颇多,已加入收藏夹了,关注作者大大了!希望作者大大能多写数据库相关的文章。
- 2023-01-11 22:05:25
-
- 疯狂的香菇
- 这篇博文真是及时雨啊,太详细了,感谢大佬分享,已收藏,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-01-11 19:02:33
-
- 乐观的口红
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享技术文章!
- 2023-01-11 16:26:51
-
- 受伤的秋天
- 太全面了,码起来,感谢作者的这篇技术贴,我会继续支持!
- 2023-01-02 08:35:39
-
- 威武的老鼠
- 这篇技术文章真是及时雨啊,细节满满,真优秀,码起来,关注博主了!希望博主能多写数据库相关的文章。
- 2023-01-01 23:21:33
-
- 坚强的冬日
- 太详细了,已加入收藏夹了,感谢博主的这篇博文,我会继续支持!
- 2022-12-31 20:47:20