2020年3月2日的面试:什么是 redis 的雪崩、穿透和击穿?

面试题

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

面试官心理分析

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

面试题剖析

缓存雪崩

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

这就是缓存雪崩。

redis-caching-avalanche

大约在 3 年前,国内比较知名的一个互联网公司,曾因为缓存事故,导致雪崩,后台系统全部崩溃,事故从当天下午持续到晚上凌晨 3~4 点,公司损失了几千万。

缓存雪崩的事前事中事后的解决方案如下:

  • 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
  • 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
  • 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

redis-caching-avalanche-solution

用户发送一个请求,系统 A 收到请求后,先查本地 ehcache 缓存,如果没查到再查 redis。如果 ehcache 和 redis 都没有,再查数据库,将数据库中的结果,写入 ehcache 和 redis 中。

限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?走降级!可以返回一些默认的值,或者友情提示,或者空白的值。

好处:

  • 数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。
  • 只要数据库不死,就是说,对用户来说,2/5 的请求都是可以被处理的。
  • 只要有 2/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来一次。

缓存穿透

对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。

黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。

举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

redis-caching-penetration

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

缓存击穿

缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

不同场景下的解决方式可如下:

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

原文地址:https://www.cnblogs.com/weigy/p/12396808.html

时间: 2024-10-11 20:48:29

2020年3月2日的面试:什么是 redis 的雪崩、穿透和击穿?的相关文章

.NET编程周记第3期-2020年1月19日

整理了2020年1月19日这周阅读的几篇有趣的和.NET开发相关的文章.在这里和大家分享. 0x00 Introducing Nullable Reference Types in C# 如标题所示,本文介绍了在C# 8之后引入的可空引用类型. 在本文的开头,介绍了空引用的起源以及Tony Hoare的“十亿美元的错误”,这是一段有趣的历史背景介绍. 介绍了在处理空引用时存在的问题,以及如何在C#8中解决这些问题的方法,即他们添加了可空引用类型来表达引用可能为空的意图. https://devb

【公告】Symantec SSL证书品牌名将于2020年4月30日停止使用

尊敬的合作伙伴和客户: Symantec SSL证书品牌名将于2020年4月30日停止使用,您可以理解为这天是Symantec品牌用于SSL证书的最后一天. 一.Symantec 品牌 SSL 证书更名 DigiCert Secure Site 品牌 SSL 证书. 二.诺顿安全认证签章同步进行了更新. 三.证书交付和使用流程没有任何影响. 四.用户在其数字证书产品的页面或资料中 有出现Symantec需要在 2020-04-30前替换成 DigiCert Secure Site. 五.更名后,

ActiveMQ 5.15.12(2020年3月9日)

这些是当前版本.对于以前的版本,请参阅以前的版本页面. ActiveMQ 5.15.12(2020年3月9日) 文献资料 视窗 apache-activemq-5.15.12-bin.zip SHA512 GPG签名 Unix / Linux / Cygwin apache-activemq-5.15.12-bin.tar.gz SHA512 GPG签名 源代码分发: activemq-parent-5.15.12-source-release.zip SHA512 GPG签名 原文地址:htt

MyBatis - 系统化复习加强 (2020年4月11日始 持续更新)

目录 MyBatis - 系统化复习加强 (2020年4月11日始 持续更新) 1 简介 1.1 什么是MyBatis 1.2 持久层 1.3 为什么要用 MyBatis 1.4 如何获取 MyBatis 2 第一个MyBatis程序 2.1 搭建环境 2.2 创建Module 2.3 运行测试 2.4 常见BUG MapperRegistry问题 ★ Could not find resource .............UserMapper.xml Error creating docum

2020年3月25日一次重要的java面试

----------------SQL优化------------------ ---------------JVM优化------------------- --------------hashmap的原理----------- -----------hashmap碰撞解决办法------ ----------mysql数据库隔离级别--------- ----------mysql乐观锁和悲观锁-------- ----------线程池的原理--------------- --------

知识星球最新资料干货汇总(截止到2020年3月13日)

编者按 「数智萤火虫」内容介绍:以大数据.人工智能.数字化转型为核心,包括星主在技术.产品.解决方案.职场等方面20年的经验积累与感悟. 跨界延伸领域:企业架构.区块链.虚拟现实.增强现实.5G.产品经理等其他领域,包括文章.PPT.音频.直播.沙龙.答疑.考评等形式. 点击「数智萤火虫」直接加入,关注微信公众号「李福东频道」进入 #内容精选# 领取3天体验卡. 文章正文 一.星球内已有资源(文章.PPT.音频.代码等) DT-0001-揭秘10大热门领域创新的真相(开篇) DT-0002-开放

老男孩教育每日一题:2017年3月7日-企业面试问答:Linux服务器如何防止中木马?

(一)解答战略 去企业面试时是有多位竞争者的,因此要注意答题的维度和高度,一定要直接秒杀竞争者,搞定高薪offer. (二)解答战术 因为Linux下的木马常常是恶意者通过Web的上传目录的方式来上传木马到Linux服务器的,可根据从恶意者访问网站开始-->Linux系统-->HTTP服务-->中间件服务-->程序代码-->DB-->存储,层层设卡防护. (三)从用户访问角度解答参考 开发程序代码对上传文件类型做限制,例如不能上传.php程序(JS及后端代码控制). 对

2020年1月1日_新年

时间静悄悄的一年又一年,对我来说今年是意义非凡的一年.从疑惑到恐惧和慌忙,最后到只剩下“去做”,做对的事,做想的事. 在今年,内心中出现最多的词是快乐.感觉.未来.世界.内心.现在. 从回到校园开始,忙忙碌碌,几乎没有一刻不在学习和思考学习,真想在这个专业再多学习两年,可是只有两年,现在大四的我,时间所剩不多,距离春招更是只剩下两个月时间,放下了工作,选择了内心,内心却充满恐惧与不安. 博客断更了很久,博客对我来说是一个能很好地总结输出的平台,能让自己看到自己到底在做什么事情,至少开一个新的随笔

2020年1月1日。

对过去的2019年总结,就是十分坎坷的一年,考研+调剂.还有一些心神不宁的事情.2019,对我来说,糟糕的更多一些,而我的运气也多了一些,可能就是互补吧.感情的风波,家里的离去.2019,这一年,真的太累了. 2020年也算来临了,双20,我要双好运,智慧和运气的并存.在刚进入2020年,我还是心潮澎湃的.我有说不清的想法,目标,我都要一一去完成,去实现.戒掉不好的坏毛病.希望自己的身体和家人的身体都能保持健康.在学业上我付出的还不够,在20年,我要学到更多的知识.帮助我去更好的构建自己的世界.