首页/数据/数据库速查/缓存穿透(查不存在的数据)
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条
Redis 运维与场景124 条

缓存穿透(查不存在的数据)

请求查永远不存在的键:缓存不命中、每次打库,恶意流量下数据库被压垮;防控=空值缓存 + 布隆过滤器 + 参数校验。

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

空值缓存示例

空值缓存示例
v = redis.get(f'user:{uid}')
if v == '__NULL__':
    return None                      # 空值也缓存,短 TTL
if v is None:
    row = db.query(uid)
    if row is None:
        redis.set(f'user:{uid}', '__NULL__', ex=60)   # 60 秒防穿透
        return None
    redis.set(f'user:{uid}', json.dumps(row), ex=300)
    return json.loads(v)
  • 空值缓存:不存在也写标记值,TTL 要短(防脏数据)
  • 布隆过滤器:写入时标记存在的 ID,查询先过滤(有一定误判)
  • 前置校验:ID 格式/范围校验,拒绝明显非法请求
  • 限流:对异常查询模式按 IP/用户限流
空值缓存的标记值要选不可能与真实值冲突的字符串(如 __NULL__),并统一封在数据访问层,别散落业务代码。

易错点

  • 空值缓存 TTL 太长:数据后来真实存在了仍被拦截
  • 布隆过滤器数据删除后仍可能被判存在(不支持删除,需重建)

数据来源与参考

  • Redis 官方文档: 使用模式
  • RedisBloom 文档: 布隆过滤器

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌