什么是缓存穿透、击穿、雪崩

缓存穿透 (Cache Penetration)

定义: 指查询一个根本不存在的数据。
由于缓存不命中,请求会穿透到数据库,而数据库也查不到。因为数据库没查到,所以也不会回写缓存。这就导致每次针对该 Key 的请求都会直达数据库。

  • 场景: 恶意攻击(查询 ID 为 -1 的数据)或业务逻辑逻辑漏洞。
  • 解决方案:
    • 布隆过滤器 (Bloom Filter): 在请求进入缓存层之前,先判断 Key 是否可能存在。
    • 缓存空对象: 即便数据库查不到,也在缓存里存一个 null(过期时间设短点)。

缓存击穿 (Cache Breakdown)

定义: 指一个极热点的 Key 在过期的瞬间,有海量并发请求同时涌入。
因为缓存刚刚失效,所有请求都会同时打到数据库去尝试加载数据并回设缓存。

  • 场景: 秒杀活动中的明星商品、突发热搜。
  • 解决方案:
    • 设置永不过期: 逻辑上不设 TTL,由后台异步更新。
    • 互斥锁 (Mutex Lock): 只允许一个请求去数据库查询并更新缓存,其他请求等待。

缓存雪崩 (Cache Avalanche)

定义: 指在某一个时间段,大面积的 Key 同时过期,或者 Redis 宕机
这导致原本应该由缓存承接的巨大流量全部像雪崩一样压向数据库,导致后端系统崩溃。

  • 区别: 击穿是“单点爆破”,雪崩是“全面瘫痪”。
  • 解决方案:
    • 随机过期时间: 给每个 Key 的 TTL 加上一个随机扰动值,防止集体过期。
    • 高可用架构: 搭建 Redis 哨兵(Sentinel)或集群(Cluster)。
    • 限流降级: 数据库压力过大时,直接拒绝部分请求。

总结对比表

现象 原因 目标数据 核心对策
穿透 数据不存在 不存在的数据 布隆过滤器 / 缓存空值
击穿 热点 Key 过期 极热点数据 互斥锁 / 逻辑永不过期
雪崩 大量 Key 过期或 Redis 宕机 大批量数据 随机过期时间 / 熔断限流
posted @ 2026-04-14 08:19  我已有个她  阅读(10)  评论(0)    收藏  举报