3分钟整明白啥是 缓存雪崩

简介: 当数据库成为瓶颈时,比如高并发、读多写少等场景,我们首先会想到的就是利用缓存来提高整个系统的性能。缓存虽然能够大大提升整个系统的性能,但同时也引入了更多复杂性。如果没有针对缓存进行比较好的处理,某些场景下甚至会导致整个系统崩溃。这次我们要聊的就是:缓存雪崩。

当数据库成为瓶颈时,比如高并发、读多写少等场景,我们首先会想到的就是利用缓存来提高整个系统的性能。

缓存虽然能够大大提升整个系统的性能,但同时也引入了更多复杂性。

如果没有针对缓存进行比较好的处理,某些场景下甚至会导致整个系统崩溃。

这次我们要聊的就是:缓存雪崩。

缓存雪崩

缓存雪崩是指当大量缓存同时失效或过期后引起系统性能急剧下降的情况。

当缓存失效或过期被清除后,系统需要再次访问数据库,再次进行运算重新生成缓存,这个处理步骤耗时比较长,上百毫秒甚至更长时间。而对于一个高并发的系统来说,几百毫秒内可能会接到几百个请求。

由于旧的缓存已经被清除,新的缓存还未生成,并且处理这些请求的线程都不知道另外有一个线程正在生成缓存,所以所有的请求都会去重新生成缓存,都会去访问数据库,对数据库造成巨大的压力和不必要的性能损耗。

这些对数据库的访问压力又会拖慢整个系统,严重的会造成数据库宕机,形成一系列连锁反应,造成整个系统崩溃。

解决办法

缓存雪崩的常用解决方法有两种:更新锁机制后台更新机制。接下来我们详细了解一下这两种方法:

更新锁机制

对缓存更新操作加入锁的保护,保证只有一个线程能够进行缓存更新的操作,没有获取更新锁的线程要么等待锁释放后重新读取缓存,要么直接返回空值或者默认值。

对于采用分布式集群的系统,一个系统中可能存在几十上百台服务器,即使单台服务器只有一个线程更新缓存,但几十上百台服务器一起算下来也会有几十上百个线程同时进行缓存更新的操作,同样存在缓存雪崩的问题。

所以分布式集群的系统要实现更新锁机制,需要用到分布式锁,比如:Redis、ZooKeeper等。

后台更新机制

在系统中,由后台线程来进行缓存更新的操作,而不是由业务线程来进行缓存更新的操作,缓存本身的有效期可以设置为永久或者足够长的时间,后台线程定时进行缓存更新的操作。

后台更新机制不仅适用于单机多线程的场景,也适用于分布式集群的场景,相比更新锁机制要简单一些。

后台更新机制还适用于业务刚上线的时候进行缓存预热。

缓存预热指系统上线后,将相关的缓存数据直接加载到缓存系统,而不是等待用户访问才来触发缓存加载。

还用一种比较特殊的场景:当缓存系统内存不够时,会清除一些缓存数据,从缓存被清除到下一次定时更新缓存的这段时间内,业务线程读取缓存返回空值,而业务线程本身又不会去更新缓存,因此从用户角度看到就是数据没有了。

对应上面这种特殊场景,我们可以使用后台更新机制和更新锁机制结合使用进行避免。

总结

缓存雪崩是指当大量缓存同时失效或过期后引起系统性能急剧下降的情况。

常用的解决方法有两种:更新锁机制后台更新机制

相关文章
|
12天前
|
消息中间件 缓存 中间件
缓存一致性问题,这么回答肯定没毛病!
缓存一致性问题,这么回答肯定没毛病!
|
2月前
|
缓存 NoSQL Go
缓存设计的好,服务基本不会倒
缓存设计的好,服务基本不会倒
|
存储 算法 固态存储
能解决你80%关于存储的疑惑
在计算机系统中,常用的存储介质包括寄存器、内存、SSD、磁盘等,寄存器的速写速度与CPU相同,一个时钟周期是0.3纳秒,而内存访问需要120纳秒,寄存器的读写速度比内存要快几百倍,固态硬盘访问需要50~150μs,磁盘访问需要一到十几毫秒,磁盘的读写速度比内存慢了几万倍,网络访问则更慢,需要几十到上百毫秒。
303 0
|
存储 机器学习/深度学习
二叉树详解一万字(基础版)看着一篇就够了(上))
树的结构是一种非线性的数据结构,它是由n(n>=0)个节点组成的一个有层次的关系集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说他是根朝上,而叶朝下。
134 0
|
存储 小程序 编译器
【C/C++】庖丁解牛 深究数据在内存中如何存储
【C/C++】庖丁解牛 深究数据在内存中如何存储
166 0
|
存储 SQL 关系型数据库
覆盖索引这回事算是整明白了
覆盖索引这回事算是整明白了
261 0
覆盖索引这回事算是整明白了
|
JavaScript 容器
一次性搞懂this
一次性搞懂this
90 0
|
运维 负载均衡 网络协议
13张图解分布式系统服务注册与发现机制,给你整明白
13张图解分布式系统服务注册与发现机制,给你整明白
13张图解分布式系统服务注册与发现机制,给你整明白
|
安全 Java
掉了两根头发,可算是把volatile整明白了
为什么只能保证可见性?又是怎么实现禁用指令重排?哇,原来这么简单
166 0
掉了两根头发,可算是把volatile整明白了
|
算法 程序员
弄懂“三门问题”,成功概率翻倍,来用代码验证一下
弄懂“三门问题”,成功概率翻倍,来用代码验证一下
245 0
弄懂“三门问题”,成功概率翻倍,来用代码验证一下