首页/数据/NoSQL 速查/缓存穿透、击穿与雪崩的处置
选型与架构50 条

缓存穿透、击穿与雪崩的处置

三类问题根因不同:穿透是不存在的 key 反复回源;击穿是热点 key 过期瞬间并发重建;雪崩是大批 key 同时失效或缓存层故障。对应处置是空值缓存/布隆过滤器、互斥重建或逻辑过期、TTL 抖动与降级预案。

NoSQL 速查数据更新于 2026-10-12

问题对照

问题触发场景常用处置
穿透查不存在的 key,缓存与库都没有缓存空值(短 TTL)、参数校验、布隆过滤器
击穿单个热点 key 过期,并发同时回源互斥重建、逻辑过期后台刷新、预热
雪崩大批 key 同时失效或缓存整体不可用TTL 加随机抖动、多级缓存、限流降级

互斥重建(伪代码)

互斥重建(伪代码)
def get_article(aid):
    v = cache.get(aid)
    if v:
        return v
    if cache.setnx("lock:" + aid, "1", 10):
        try:
            v = db.load(aid)
            cache.set(aid, v, ttl=600)
        finally:
            cache.delete("lock:" + aid)
    else:
        sleep(0.05)           # 等重建完成,生产要限次退避
    return cache.get(aid)
逻辑过期:value 中带 expire_at 字段,物理不过期;逻辑过期后先返回旧值,同时异步刷新,适合能容忍短暂旧数据的热点页。

易错点

  • 布隆过滤器存在误判,可能把不存在的 key 判为存在,不能当唯一防线
  • 空值缓存要能区分真实空结果与异常空结果,并设置较短 TTL 控制内存占用

数据来源与参考

  • Redis Docs: Key eviction
  • Hazelcast Docs: Cache stampede(概念参考)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌