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

Apr 10, 2020


本文参考:这里这里

缓存击穿

含义

一个存在的key,在缓存过期的那一刻,同时有大量的请求,同时读取缓存未能读到数据又同时请求DB,造成DB压力骤增

解决方案

  1. 设置热点数据永不过期
  2. 设置互斥锁,大量请求同时读取缓存未能读到数据时,只有一个请求可以拿到锁并请求DB

缓存穿透

含义

大量访问缓存和数据库中都不存在的key(即非法访问),此时缓存不起作用,请求会穿透到DB,造成DB压力骤增
这种情况往往是非法攻击

解决方案

  1. 接口层增加校验,比如用户鉴权;key的基础校验(key>0等)
  2. 采用布隆过滤器存储可能访问的key,不存在的key直接被过滤
  3. 访问key未在DB中查询到值,则将空值写进缓存,并设置较短过期时间(比如30秒),可防止攻击者使用同一key暴力攻击

缓存雪崩

含义

大量的key设置了相同的过期时间,导致大量key在同一时刻全部失效,大量请求直接访问DB,引起雪崩

解决方案

  1. 设置热点数据永不过期
  2. 缓存设置过期时间时加上一个随机值,防止同一时间大量key过期
  3. 如果缓存是分布式的,则将热点数据均匀分布在不同缓存服务器中

总结

概念 原因 解决方案
缓存击穿 一个key过期的同时有大量请求 热点数据永不过期;互斥锁
缓存穿透 key不存在,直接大量访问DB 请求校验;布隆过滤器;缓存空值
缓存雪崩 大量key同时过期 热点数据永不过期;过期时间尽量随机