缓存雪崩

什么是缓存雪崩

缓存雪崩指的是,大量的应用无法在 Redis 缓存中处理,然后大量请求发送到了数据库,导致数据库的压力激增,甚至可能导致数据库崩溃,从而导致整个系统崩溃,引发雪崩一样的连锁效应。
而引起缓存雪崩的原因,一般如下:

  1. - 缓存中大量 key 同时过期
  2. - Redis 实例挂掉了,无法处理请求

缓存异常处理 - 图1

解决方案

针对第一种大量key同时过期的情况,解决起来比较简单,只需要将每个key的过期时间打散即可,使它们的失效点尽可能均匀分布。
针对第二种redis发生故障的情况,部署redis时可以使用redis的几种高可用方案部署,部署方法可以参考我之前的文章Redis高可用方案—主从(masterslave)架构Redis高可用架构—哨兵(sentinel)机制详细介绍Redis高可用架构—Redis集群(Redis Cluster)详细介绍

缓存穿透

什么是缓存穿透

缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候,对数据库造成的压力就非常大,甚至可能直接挂掉。
缓存异常处理 - 图2

解决方案

解决缓存穿透的方法一般有两种:

  • 第一种是缓存空对象
  • 第二种是使用布隆过滤器。

    缓存击穿

    什么是缓存击穿

    存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。
    缓存异常处理 - 图3

    解决方案

    解决缓存击穿的方法也有两种:

    • 第一种是设置key永不过期;
    • 第二种是使用分布式锁

保证同一时刻只能有一个查询请求重新加载热点数据到缓存中,这样,其他的线程只需等待该线程运行完毕,即可重新从Redis中获取数据。