缓存穿透

查询不存在的数据时缓存永不命中,请求持续落到数据库;对策包括空值缓存(短期)、布隆过滤器前置拦截与参数合法性校验。

空值缓存对不存在的结果缓存短 TTL,注意与新增数据的一致性
布隆过滤器判断“可能存在”,明显不存在直接拒绝
校验ID 格式与范围校验,拦截明显非法请求

防护流程(伪代码)

防护流程(伪代码)
v = cache.get(key)
if v == NULL_MARK: return None        # 空值缓存命中,直接返回
if v is None:
    v = db.query(key)
    if v is None: cache.set(key, NULL_MARK, ttl=60s)
    else: cache.set(key, v, ttl=10m)
return v

# 新增记录:写库成功后删除对应空值标记
# 前置校验:ID 格式与范围检查放在查缓存之前
空值缓存要与数据创建流程联动:新建记录后主动清理对应空值标记,避免短暂不可见。

易错点

  • 恶意随机 ID 持续打库,缓存层形同虚设
  • 空值缓存未随数据创建清理,查询短时不一致

数据来源与参考

  • Redis 文档:布隆过滤器(Bloom Filter)
  • 《System Design Interview》卷 1(Alex Xu):缓存章节
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌