了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?

目录

一、面试官心理分析

二、面试题剖析

1. 缓存雪崩        

2. 缓存穿透

3. 缓存击穿


一、面试官心理分析

        其实这是问到缓存必问的,因为缓存雪崩和穿透,是缓存最大的两个问题,要么不出现,一旦出现就是致命性的问题,所以面试官一定会问你。

二、面试题剖析

1. 缓存雪崩        

        对于系统 A,假设每天高峰期每秒 5000个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时1秒5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。
        这就是缓存雪崩。

        大约在3年前,国内比较知名的一个互联网公司,曾因为缓存事故,导致雪崩,后台系统全部崩溃,事故从当天下午持续到晚上凌晨 3~4 点,公司损失了几千万。
缓存雪崩的事前事中事后的解决方案如下:
        · 事前: Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
        · 事中: 本地 ehcache 缓存 +hystrix 限流&降级,避免 MySQL 被打死。
        · 事后: Redis持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。 

        用户发送一个请求,系统A收到请求后,先査本地 ehcache 缓存,如果没査到再査 Redis。如果 ehcache 和 Redis 都没有,再査数据库,将数据库中的结果,写入 ehcache 和 Redis 中。
        限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?走降级!可以返回一些默认的值,或者友情提示,或者空值。
好处:
        数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。

        只要数据库不死,就是说,对用户来说,2/5的请求都是可以被处理的。

        只要有 2/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来了。 

2. 缓存穿透

        对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。
        举个栗子。数据库id 是从1开始的,结果黑客发过来的请求id 全部都是负数。这样的话,缓存中不会有,请求每次都“ 视缓存于无物 ”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

        解决方式很简单,每次系统A从数据库中只要没查到,就写一个空值到缓存里去,比如set-999  UNKNOWN 。然后设置一个过期时间,这样的话,下次有相同的key来访问的时候,在缓
存失效之前,都可以直接从缓存中取数据。 

3. 缓存击穿

        缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。
不同场景下的解决方式可如下:
        若缓存的数据是基本不会发生更新的,则可尝试将该热点数据设置为永不过期。

        若缓存的数据更新不频繁,且缓存刷新的整个流程耗时较少的情况下,则可以采用基于Redis、zookeeper 等分布式中间件的分布式互斥锁,或者本地互斥锁以保证仅少量的请求能请求数据库并重新构建缓存,其余线程则在锁释放后能访问到新缓存。
        若缓存的数据更新频繁或者在缓存刷新的流程耗时较长的情况下,可以利用定时线程在缓存过期前主动地重新构建缓存或者延后缓存的过期时间,以保证所有的请求能一直访问到对应的缓存。

(ps:一个点赞一份爱,点个关注不迷路!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540669.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux网络服务学习(1):nfs

1.什么是nfs NFS:网络文件系统。 *让客户端通过网络访问服务器磁盘中的数据,是一种在linux系统间磁盘文件共享的方法。 *nfs客户端可以把远端nfs服务器的目录挂载到本地。 *nfs服务器一般用来共享视频、图片等静态数据。一般是作为被读取的对象&…

探索数据结构:双向链表的灵活优势

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 前言 前面我们学习了单链表,它解决了顺序表中插入删除需…

感谢Cognition公司AI程序员Devin为人类程序员提供新工作:AI驯兽师AI鼓励师AI接锅侠

讲动人的故事,写懂人的代码 初创公司Cognition最近推出的AI程序员Devin,只会给人类程序员增加3类新工作。 最近,初创公司Cognition告诉大家一个新闻:他们研发了个AI程序员,名叫Devin。 Devin能干这些事: …

1.Python数据分析—数据分析与挖掘详讲

1.Python数据分析—数据分析与挖掘详讲 一个人简介二数据分析与挖掘概述三什么是数据分析和挖掘四数据分析与挖掘在不同领域的应用4.1医疗领域:4.1.1 建立疾病数据库:4.1.2 临床决策支持:4.1.3 疾病预警和监控: 4.2 电子商务领域&…

Ollama管理本地开源大模型,用Open WebUI访问Ollama接口

现在开源大模型一个接一个的,而且各个都说自己的性能非常厉害,但是对于我们这些使用者,用起来就比较尴尬了。因为一个模型一个调用的方式,先得下载模型,下完模型,写加载代码,麻烦得很。 对于程…

又新增5本!共8本预警期刊被“On Hold”,2本中科院TOP刊仍在调查中!

【SciencePub学术】 近日,经小编查询,又新增5本预警期刊被“暂停调查”!目前,共8本预警期刊被列入风险期刊!其详情如下: 01 新增“On Hold”期刊详情 1 BIOENGINEERED ISSN:2165-5979 IF&…

读《Cheating Depth: Enhancing 3D Surface Anomaly Detection via Depth Simulation》

WCAV2024 摘要&引言 RGB骨干:某些表面异常仅在RGB中实际上仍然是看不见的,因此需要合并三维信息(确实重点在于“合并”,单纯看例子里的深度图片也看不出来异常在哪里,但是和rgb overlay之后就明显一些了&#xf…

解锁锂电生产新密码:RFID技术实现大圆柱电池追溯精准化管理

锂电行业近年来飞速发展,尤其是在电动汽车和储能系统的推动下,大圆柱锂电池作为一种重要的电池形态备受关注。大圆柱电池因其独特的设计和结构优势,成为众多高端应用场景的首选。另外,大圆柱电池便于大规模生产和集成,…

2024 MCM数学建模美赛2024年A题复盘,思路与经验分享:资源可用性与性别比例 | 七鳃鳗的性别比例变化对生态系统稳定性的影响(四)

审题 第三问要我们评估七鳃鳗的性别比例变化对生态系统稳定性的影响。 这里我们就要去查一下生态系统稳定性的定义。 通过查资料我们知道,生态系统稳定性包括生态系统的抵抗力和恢复力。 OK,到这里问题就变成了,七鳃鳗的性别比例对生态系…

被军训到的两天

1.gradle7.6.1 1.安装gradle7.6.1,一定要注意的是,使用的JDK是否能用,比如gradle7.6.1用的是JDK11。 2. F:/sofer....是Gradle自己的仓库地址,注意不能和maven使用一样的仓库。 使用specified location,可以避免下本项目的gradle版本&…

大数据队列Kafka

了解什么是kafka之前,首先要了解一下什么是消息队列 一丶kafka的基本概述 消息队列:MQ介绍 定义 官方定义:消息队列是一种异步的服务间通信方式,是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸…

【物联网】Modbus 协议及Qinghub物联网平台应用

Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集,这里就我们的实际项目经验分享Modbus协议 你可以通过QingHub作业直接体验试用,也可以根据手册开发相应的代码块。 qinghub项目已经全面开源。 …