我们知道缓存雪崩、击穿、穿透是缓存异常最常见的三个问题,一旦这三个问题发生,会导致大量的请求积压到数据库层。如果请求的并发量很大,就会导致数据库宕机或是故障,这肯定是我们不能容忍的。今天我就带你彻底剖析这三个问题,让你知道这三个问题的表现、诱发原因以及解决方法,废话不多说,直接开始。
缓存雪崩
缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。 缓存雪崩一般是由下面这两个原因导致的,我们慢慢来看。
第一个原因是:缓存中有大量数据同时过期,导致大量请求无法得到处理。
具体来说,当数据保存在缓存中,并且设置了过期时间时,如果在某一个时刻,大量数据同时过期,此时,应用再访问这些数据的话,就会发生缓存缺失。紧接着,应用就会把请求发送给数据库,从数据库中读取数据。如果应用的并发请求量很大,那么数据库的压力也就很大,这会进一步影响到数据库的其他正常业务请求处理。我们来看一个简单的例子,如下图所示:
那这对这种原因,怎么解决呢?
首先,我们可以避免给大量的数据设置相同的过期时间。如果业务层的确要求有些数据同时失效,你可以在用 EXPIRE 命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数(例如,随机增加 1~3 分钟),这样一来,不同数据的过期时间有所差别,但差别又不会太大,既避免了大量数据同时过期,同时也保证了这些数据基本在相近的时间失效,仍然能满足业务需求。
其次,还可以通过服务降级,来应对缓存雪崩。所谓的服务降级,是指发生缓存雪崩时,针对不同的数据采取不同的处理方式:
- 当业务应用访问的是非核心数据(例如电商商品属性)时,暂时停止从缓存中查询这些数据,而是直接返回预定义信息、空值或是错误信息;
- 当业务应用访问的是核心数据(例如电商商品库存)时,仍然允许查询缓存,如果缓存缺失,也可以继续通过数据库读取。

本文详细介绍了缓存系统中常见的三种异常:雪崩、击穿和穿透。缓存雪崩可能由大量数据同时过期或缓存实例故障导致,解决方案包括设置随机过期时间、服务降级、熔断和限流等。缓存击穿通常发生在热点数据过期时,解决办法是不设置过期时间或缓存空值。缓存穿透可能是业务误操作或恶意攻击引起,可通过缓存空值、布隆过滤器或请求检测来防范。
最低0.47元/天 解锁文章
1317

被折叠的 条评论
为什么被折叠?



