Redis缓存雪崩

Redis缓存雪崩指的是在某个时间段,缓存中的大部分数据同时失效,导致大量的请求直接打到数据库上,使得数据库瞬间压力过大,甚至宕机的情况。这种情况下,系统的可用性会受到严重影响。

造成缓存雪崩的原因可能是缓存服务器宕机、缓存键值过期时间设置相同、热点数据过多集中访问等。

  1. 加强监控,及时发现缓存故障,避免雪崩的出现。
  2. 缓存失效时间随机化:可以在原有失效时间的基础上增加一个随机值,分散缓存过期时间,防止同时过期的情况出现,从而降低缓存雪崩的概率。
  3. 设置缓存不过期: 我们可以通过后台服务来更新缓存数据,从而避免因为缓存失效造成的缓存雪崩,也可以在一定程度上避免缓存并发问题。
  4. 数据预热:在系统上线前,将相关的缓存数据手动加载到缓存系统中,让缓存逐渐达到一个平衡状态。
  5. 增加缓存层:可以增加一层缓存,将数据缓存在不同的缓存层,缓存失效时间设置不同,降低缓存雪崩的风险。
  6. 限流熔断:通过限制某个时间段内请求的数量,或者当缓存失效后,通过熔断机制将请求直接拒绝,降低数据库的压力。

Redis缓存击穿

如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。可以认为缓存击穿是缓存雪崩的一个子集。

  1. 互斥锁方案(Redis 中使用 setNX 方法设置一个状态位,表示这是一种锁定状态),保证同一时间只有一个业务线程请求缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。
  2. 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;

Redis缓存穿透

Redis 缓存穿透是指在缓存中无法找到所请求的数据,导致该请求穿透到后端数据库,使得数据库产生了负载。这种情况可能会发生在请求的数据本身不存在,或者请求的数据不符合缓存的规则,导致缓存无法命中。

缓存穿透会对后端数据库造成很大的负担,甚至会引起宕机等问题,因此需要采取相应的措施来防止缓存穿透。

  1. 缓存空对象:当缓存中没有找到请求的数据时,可以将一个空的对象缓存起来,这样下次请求同样的数据时,就可以直接从缓存中获取了。但是需要注意的是,空对象的缓存时间不要设置过长,否则会导致缓存中的空对象占用大量的空间,反而会增加缓存的负担。
  2. 布隆过滤器:布隆过滤器是一种数据结构,可以快速判断一个元素是否存在于集合中。可以将所有可能存在的数据哈希到一个足够大的位数组中,当一个请求过来时,先判断该请求的数据是否存在于位数组中,如果不存在,则可以直接返回,否则再去访问后端数据库。由于布隆过滤器的空间复杂度很小,因此可以大大降低缓存穿透的风险。
  3. 非法请求的限制:当有大量恶意请求访问不存在的数据的时候,也会发生缓存穿透,因此在 API 入口处我们要判断求请求参数是否合理,请求参数是否含有非法值、请求字段是否存在,如果判断出是恶意请求就直接返回错误,避免进一步访问缓存和数据库。