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

3分钟搞懂什么是缓存雪崩

时间:2023-04-01 18:32:49 Java

当数据库成为瓶颈,比如高并发,读多写少等,我们首先想到的就是利用缓存来提升整个系统的性能系统。虽然缓存可以大大提高整个系统的性能,但同时也引入了更多的复杂性。如果缓存处理不当,在某些场景下甚至会导致整个系统崩溃。这次我们要讲的是:缓存雪崩。缓存雪崩缓存雪崩是指当缓存失效或过期时,系统性能急剧下降的情况。当缓存失效或过期清除后,系统需要再次访问数据库并进行计算重新生成缓存。这个处理步骤需要很长时间,数百毫秒甚至更长。对于高并发的系统,可能在几百毫秒内收到数百个请求。由于旧的缓存已经被清除,新的缓存还没有生成,而处理这些请求的线程并不知道另一个线程正在生成缓存,所有的请求都会重新生成缓存并访问数据库,对数据库造成巨大的破坏压力和不必要的性能损失。这些对数据库的访问压力会拖慢整个系统,严重的会导致数据库宕机,形成一系列的连锁反应,导致整个系统崩溃。解决方案缓存雪崩常见的解决方案有两种:更新锁机制和后台更新机制。下面我们来详细了解一下这两种方式:更新锁机制为缓存更新操作增加了锁保护,保证只有一个线程可以执行缓存更新操作,没有获取更新锁的??线程要么等待释放锁并重新读取缓存。要么直接返回null,要么返回默认值。对于使用分布式集群的系统,一个系统中可能有几十台或者几百台服务器。即使单个服务器只有一个线程来更新缓存,如果几十个或者上百个服务器一起算起来,同时也会有几十个或者几百个线程。缓存更新操作也存在缓存雪崩的问题。因此,在分布式集群系统中,要实现更新锁机制,就需要分布式锁,如Redis、ZooKeeper等后台更新机制在系统中,缓存更新操作由后台线程执行,而不是业务线。缓存本身的有效期可以设置为永久或者足够长,缓存更新由后台线程定时执行。操作。后台更新机制不仅适用于单机多线程场景,也适用于分布式集群场景,比更新锁机制简单。后台更新机制也适用于业务刚上线时的缓存预热。缓存预热是指系统上线后,直接将相关缓存数据加载到缓存系统中,而不是等待用户访问触发缓存加载。还用到一个特殊的场景:当缓存系统内存不足时,会清除部分缓存数据。从缓存被清除到下一次定时更新缓存这段时间,业务线程读取缓存并返回空值,而业务线程本身并没有更新缓存,所以从用户的角度来看,数据不见了。对应上面的特殊场景,我们可以使用后台更新机制和更新锁机制来避免。总结缓存雪崩是指当缓存失效或过期时,系统性能急剧下降的情况。常用的解决方案有两种:更新锁机制和后台更新机制。最后谢谢大家的喜欢和关注,帅气又漂亮。