当前位置: 首页 > 后端技术 > Java

【专访普通人VS专家系列】谈谈对缓存雪崩和缓存穿透的理解,以及如何避免?

时间:2023-04-02 02:14:51 Java

听说10个人去一个互联网公司面试,9个人会被问到缓存雪崩和缓存穿透的问题。据说这9人中至少有8人给出了不完整的答案。这8个人里面,都是和网上找的各种面试资料打交道,并没有真正看懂。当然,这也是正常的。只有大规模应用缓存的架构才会关注这两个问题。那么如何真正理解这两个问题的底层逻辑,让我们看看普通人和专家的回答。普通人:嗯....专家:缓存雪崩是指缓存中存储的大量数据同时过期,大部分原有的缓存组件抵制所有流量请求到数据库。由于数据库压力增大而导致数据库服务器崩溃的现象。缓存雪崩我觉得主要有两个原因:缓存中间件宕机,当然可以通过为缓存中间件做一个高可用集群来避免。缓存中的大部分key都设置了相同的过期时间,导致这些key同时过期。对于这种情况,可以将1到5分钟的随机值添加到到期时间。缓存穿透问题是指应用在短时间内有大量不存在的key请求,而这些不存在的key在缓存中找不到,所以全部穿透数据库,造成数据库压力.我觉得这个场景的核心问题是对缓存的攻击,因为在正常的业务中,即使出现这样的情况,由于缓存的持续预热,影响也不会很大。攻击行为需要有时间上的连续性,只有在数据库中不存在key的情况下才能达到这个目的。因此,我认为有两种解决方法:将失效的key保存到Redis里面,并设置一个特殊的值,比如“null”,这样下次访问就不会去查数据库了。但是,如果攻击者继续使用随机的不存在的密钥访问,还是会出现问题,所以可以用Bloomfilter来实现。系统启动时,所有目标数据都缓存在布隆过滤器中。当攻击使用不存在的key请求时,首先在Bloomfilter中查询,如果不存在,则说明该key在数据库中不存在。布隆过滤器的另一个优点是它使用位图进行数据存储,占用的内存空间非常小。不过,我觉得你提的问题有点过于放大了。首先,在一个成熟的系统中,必须有专门的缓存系统来维护重要的热点数据,其过期时间维护必须区别于其他业务key。而且对于非常重要的场景,我们还会设计多级缓存系统。其次,即使触发了缓存雪崩,数据库本身的容灾能力也没有那么脆弱。数据库的主从、双主、读写分离的策略可以很好的缓解并发流量。最后,数据库本身对最大连接数有限制。超过限制的请求将被拒绝。结合熔断机制,可以很好的保护数据库系统,顶多造成部分用户体验不好。另外,在程序设计上,为了避免缓存未命中导致大量请求穿透数据库的问题,还可以在访问数据库的时候加一把锁。虽然性能受到影响,但对系统来说是安全的。总而言之,我觉得解决方案有很多种,具体选择哪种方式要看具体的业务场景。以上是我对这个问题的理解。总结一下,我发现现在很多面试真的是为了面试而面试,不是从网上提问题,就是不断地问无关紧要的问题。至于面试官最后如何判断你是否合适,我们不得而知。估计有小伙伴说,要看你的长相,要看你的眼睛!我认为一个合格的面试官必须有非常扎实的技术背景。本期普通人VS高手访谈系列到此结束,喜欢的朋友记得点赞收藏哦。另外,大家有什么技术或者专业开发相关的问题,可以私信我,我会尽快回复。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!