缓存的常见面试题III
摘要
最近知乎上有一个问题是关于缓存的一些知识,问题主要是缓存的穿透、击穿和雪崩等等,这些主要涉及的不是什么高深的知识,只是在系统设计过程中,遇到的一些问题的解决方案,人们用一些词语来形象的概况了下问题的情形,所以才有了上述的问题。
笔者在面试人员的时候,如果能通过了前面的基础面试后,也会来一题关于缓存的问题,下面,笔者就通过平常的面试过程,来给大家聊聊这个缓存的问题。
上文(第二篇文章)介绍了缓存击穿的问题,主要是由于同一时间大量访问某一失效key造成的问题。这时,如果缓存数据中有大量的key失效了?又会导致什么样的问题那。
缓存雪崩
笔者:书接上回,我们刚才说的是同一key的大量访问,那如果有大批的可以在同一时间失效,会导致什么样的问题?
候选人:当大量的key同一时间失效时,如果有很多的请求来访问这些key,将会导致数据库压力增大,导致数据库连接数不足的问题,因为每个访问都要建立一次连接,tcp/ip连接的建立与释放,都是十分耗时的,由于同时请求数据库,虽然单个请求可以很快的返回,但服务器请求的数量巨大,连接建立较慢,数据库查询压力还是很巨大的,最终还会造成服务器返回很慢。
笔者:你说的很好,表达的很清楚,那遇到这样的问题,我们需要如何解决那?
候选人:对于大量key同一时间失效的问题,我们可以在初始化加载数据的时候,对不同的key设置不同的过期时间,避免同一时间大量key的数据失效。其次,也可以在系统后台设置一个定时任务,扫描快要过期的数据,为key增加生命周期。第三,还有一个办法就是,热点数据每次访问都为该数据增加一些失效时间,防止热点数据同一时间失效。最后,如果数据会被一直访问,而且不需要涉及到数据变更,那么,我们还可以把数据的失效策略设置为永不失效。
笔者:您的思路很全面,是的,对于大量的数据失效问题,这个现象就是缓存雪崩,而要解决这样的我呢提,就要从根源上查找问题,才能设计出更优秀的设计方案。还有就是,一个系统,我们要根据不同的使用场景来设计不同的失效策略,随机应变,而非生搬硬套。好的,谢谢您配合笔者演示完这次的缓存存在的三个问题。
后续
缓存的问题分了三个问题,本文为缓存问题的最后一个问题,希望您的喜欢,如果您喜欢,或者能解决您的问题,还请个赞。