
一句话承诺:给你流程图与Key设计清单,稳定常见场景下的“偶发失效”,避免读写错配与过期抖动。
问题 | 症状 | 根因 | 兜底策略 |
|---|---|---|---|
过期抖动 | 突然大量命中DB | 大量Key同一时间过期 | 过期时间加随机抖动 |
并发穿透 | 并发读写错配 | 先读后写未设置锁 | 使用mutex或分布式锁 |
空值穿透 | 缓存未命中反复DB查询 | 对不存在数据未缓存空值 | 空值缓存+短过期 |

# Key 命名规范
app:module:entity:{id}
# 例如:shop:prod:detail:123import redis, time, random
r = redis.Redis(host='localhost', port=6379)
LOCK_TTL = 5
CACHE_TTL = 300
JITTER = 60 # 随机抖动秒
def get_detail(prod_id):
key = f"shop:prod:detail:{prod_id}"
data = r.get(key)
if data is not None:
return data
# 互斥锁避免并发穿透
lock_key = key + ":lock"
if r.set(lock_key, '1', nx=True, ex=LOCK_TTL):
# 查询DB(伪代码)
data = query_db(prod_id)
if data is None:
# 空值也缓存,避免穿透
r.set(key, '', ex=60)
r.delete(lock_key)
return None
# 设置随机过期,避免同一时刻大面积失效
ttl = CACHE_TTL + random.randint(0, JITTER)
r.set(key, data, ex=ttl)
r.delete(lock_key)
return data
else:
time.sleep(0.05)
return r.get(key)ex 并在写入后删除锁。前端静态资源缓存控制:ETag/Last-Modified/Cache-Control 的最小组合(对照表)。