空值缓存示例
空值缓存示例
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__),并统一封在数据访问层,别散落业务代码。