问题对照
| 问题 | 触发场景 | 常用处置 |
|---|---|---|
| 穿透 | 查不存在的 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 字段,物理不过期;逻辑过期后先返回旧值,同时异步刷新,适合能容忍短暂旧数据的热点页。