Skip to content

Redis 缓存雪崩、缓存穿透、缓存击穿

缓存雪崩

Redis 缓存 key 同一时间大量失效,导致大量请求全部打到数据库,造成数据库挂掉。

应对方案:

  1. 随机初始化缓存失效时间
  2. 把热点 key 分散到不同的集群
  3. 不设置缓存失效时间
  4. 通过定时任务刷新缓存使缓存永不失效

缓存穿透

是指缓存和数据库中都没有的数据,一般常见于黑客攻击。

比如用请求 id=-1 的数据,这种数据直接穿透缓存,打在数据库上,导致数据库挂掉。

应对方案:

  1. 接口层增加校验,如用户鉴权校验,id 做基础校验,id <= 0 的直接拦截。
  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将 key-value 对写为 key-null,缓存有效时间可以设置短点,如 30 秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个 id 暴力攻击。
  3. 布隆过滤器(Bloom Filter)。

缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

应对方案:

  1. 设置热点数据缓存永远不过期。
  2. 加锁(互斥锁/分布式锁)。

Released under the MIT License.