
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
缓存功能的应用在许多软件开发项目中都是非常常用的一个编程开发功能,而本文我们就通过案例分析来了解一下,缓存雪崩的概念以及解决方法。
缓存雪崩
缓存雪崩是指当缓存失效或过期后引起系统性能急剧下降的情况。
当缓存失效或过期被清除后,系统需要再次访问数据库,再次进行运算重新生成缓存,这个处理步骤耗时比较长,上百毫秒甚至更长时间。而对于一个高并发的系统来说,几百毫秒内可能会接到几百个请求。
由于旧的缓存已经被清除,新的缓存还未生成,并且处理这些请求的线程都不知道另外有一个线程正在生成缓存,所以所有的请求都会去重新生成缓存,都会去访问数据库,对数据库造成巨大的压力和不必要的性能损耗。
这些对数据库的访问压力又会拖慢整个系统,严重的会造成数据库宕机,形成一系列连锁反应,造成整个系统崩溃。
解决办法
缓存雪崩的常用解决方法有两种:更新锁机制和后台更新机制。接下来我们详细了解一下这两种方法:
更新锁机制
对缓存更新操作加入锁的保护,保证只有一个线程能够进行缓存更新的操作,没有获取更新锁的线程要么等待锁释放后重新读取缓存,要么直接返回空值或者默认值。
对于采用分布式集群的系统,一个系统中可能存在几十上百台服务器,即使单台服务器只有一个线程更新缓存,但几十上百台服务器一起算下来也会有几十上百个线程同时进行缓存更新的操作,同样存在缓存雪崩的问题。
所以分布式集群的系统要实现更新锁机制,需要用到分布式锁,比如:Redis、ZooKeeper等。
后台更新机制
在系统中,由后台线程来进行缓存更新的操作,而不是由业务线程来进行缓存更新的操作,缓存本身的有效期可以设置为永久或者足够长的时间,后台线程定时进行缓存更新的操作。
后台更新机制不仅适用于单机多线程的场景,也适用于分布式集群的场景,相比更新锁机制要简单一些。
后台更新机制还适用于业务刚上线的时候进行缓存预热。
缓存预热指系统上线后,将相关的缓存数据直接加载到缓存系统,而不是等待用户访问才来触发缓存加载。
还用一种比较特殊的场景:当缓存系统内存不够时,会清除一些缓存数据,从缓存被清除到下一次定时更新缓存的这段时间内,业务线程读取缓存返回空值,而业务线程本身又不会去更新缓存,因此从用户角度看到就是数据没有了。
对应上面这种特殊场景,我们可以使用后台更新机制和更新锁机制结合使用进行避免。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。