听说10个人去互联网公司面试,有9个人会被问到缓存雪崩和缓存穿透的问题。
听说,这9个人里面,至少有8个人回答得不完整。
而这8个人里面,全都是在网上找的各种面试资料去应付的,并没有真正理解。
当然,也很正常,只有大规模应用缓存的架构才会重点关注这两个问题。
那么如何真正理解这两个问题的底层逻辑,我们来看普通人和高手的回答。
普通人:
嗯.................
高手:
缓存雪崩,就是存储在缓存里面的大量数据,在同一个时刻全部过期,
原本缓存组件抗住的大部分流量全部请求到了数据库。
导致数据库压力增加造成数据库服务器崩溃的现象。
导致缓存雪崩的主要原因,我认为有两个:
- 缓存中间件宕机,当然可以对缓存中间件做高可用集群来避免。
- 缓存中大部分key都设置了相同的过期时间,导致同一时刻这些key都过期了。对于这样的情况,可以在失效时间上增加一个1到5分钟的随机值。
缓存穿透问题,表示是短时间内有大量的不存在的key请求到应用里面,而这些不存在的key在缓存里面又找不到,从而全部穿透到了数据库,造成数据库压力。
我认为这个场景的核心问题是针对缓存的一种攻击行为,因为在正常的业务里面,即便是出现了这样的情况,由于缓存的不断预热,影响不会很大。
而攻击行为就需要具备时间是的持续性,而只有key确实在数据库里面也不存在的情况下,才能达到这个目的,所以,我认为有两个方法可以解决:
- 把无效的key也保存到Redis里面,并且设置一个特殊的值,比如“null”,这样的话下次再来访问,就不会去查数据库了。
但是如果攻击者不断用随机的不存在的key来访问,也还是会存在问题,所以可以用布隆过滤器来实现,在系统启动的时候把目标数据全部缓存到布隆过滤器里面,当攻击者用不存在的key来请求的时候,先到布隆过滤器里面查询,如果不存在,那意味着这个key在数据库里面也不存在。
布隆过滤器还有一个好处,就是它采用了bitmap来进行数据存储,占用的内存空间很少。
不过,在我看来,您提出来的这个问题,有点过于放大了它带来的影响。
首先,在一个成熟的系统里面,对于比较重要的热点数据,必然会有一个专门缓存系统来维护,同时它的过期时间的维护必然和其他业务的key会有一定的差别。而且非常重要的场景,我们还会设计多级缓存系统。
其次,即便是触发了缓存雪崩,数据库本身的容灾能力也并没有那么脆弱,数据库的主从、双主、读写分离这些策略都能够很好的缓解并发流量。
最后,数据库本身也有最大连接数的限制,超过限制的请求会被拒绝,再结合熔断机制,也能够很好的保护数据库系统,最多就是造成部分用户体验不好。
另外,在程序设计上,为了避免缓存未命中导致大量请求穿透到数据库的问题,还可以在访问数据库这个环节加锁。虽然影响了性能,但是对系统是安全的。
总而言之,我认为解决的办法很多,具体选择哪种方式,还是看具体的业务场景。
以上就是我对这个问题的理解。
总结
我发现现在很多面试,真的是为了面试而面试,要么就是在网上摘题,要么就是不断的问一些无关痛痒的问题。
至于最终面试官怎么判断你是否合适,咱也不知道,估计就是有些小伙伴说的,看长相,看眼缘!
我认为一个合格的面试官,他必须要具备非常深厚的技术功底。
本期的普通人VS高手面试系列就到这里结束了,喜欢的朋友记得点赞和收藏。
另外,有任何技术上的问题,职业发展有关的问题,都可以私信我,我会在第一时间回复。
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自Mic带你学架构
!
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。