Redis 缓存穿透、击穿、雪崩的区别与应对

Cold 发布于 2021-05-30 23 次阅读 365 字 预计阅读时间: 2 分钟 后端开发


这三个词经常被混着说,其实场景不一样,应对方式也不同。

缓存穿透

现象:查一个数据库里也不存在的 key,缓存没命中,每次都打到 DB。

场景:恶意攻击用不存在的 ID 刷接口。

应对:

  • 缓存空值,设短过期时间(比如 60 秒)
  • 布隆过滤器,判断 key 是否可能存在
  • 参数校验,非法 ID 直接拒绝

缓存击穿

现象:某个热点 key 过期瞬间,大量请求同时打到 DB。

场景:首页 banner、秒杀商品。

应对:

  • 互斥锁:只让一个请求去加载,其他等待
  • 热点 key 永不过期,后台异步更新
  • 逻辑过期:value 里存过期时间,异步刷新

缓存雪崩

现象:大量 key 同一时间过期,或者 Redis 挂了,请求全打到 DB,DB 扛不住连锁崩。

应对:

  • 过期时间加随机值,避免同时失效
  • Redis 高可用(哨兵/集群)
  • 本地缓存做二级缓冲
  • DB 层限流、熔断降级

一张表总结

问题原因核心思路
穿透查不存在的数据拦截无效请求
击穿热点 key 过期互斥加载
雪崩大量 key 同时失效打散过期时间 + 高可用

实际做缓存,先想清楚「哪些数据能缓存、过期多久、失效了怎么办」,比背概念有用。

和喜欢的一切在一起~
最后更新于 2021-05-30