首页/数据/数据库速查/空值缓存与防穿透标记实践
Redis 运维与场景124 条

空值缓存与防穿透标记实践

空值缓存是把「不存在」也变成缓存内容:实现要点=固定标记值、短 TTL、与真实值同一读取路径、更新时同步失效。

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

统一封装(推荐写法)

统一封装(推荐写法)
NULL = '__NULL__'

def cache_get(key, loader, ttl=300, null_ttl=60):
    v = redis.get(key)
    if v == NULL:
        return None
    if v is not None:
        return v
    val = loader()               # 回源
    if val is None:
        redis.set(key, NULL, ex=null_ttl)
    else:
        redis.set(key, val, ex=ttl)
    return val
标记值选业务不可能产生的字符串
TTL空值比正常值短(60-120 秒)
失效数据创建后要显式删除该标记键
写路径注意:新建数据后若只写库不回填缓存,要确保删除旧的空值标记,否则新数据读不到。

易错点

  • 标记值与正常 value 冲突:业务真存了同样的字符串就被当成不存在
  • 新建数据不删空值标记:用户注册后仍查询不到

数据来源与参考

  • Redis 官方文档: 使用模式
  • 缓存穿透防护实践

相关工具

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