首页/数据/数据库速查/缓存一致性(先写库还是先删缓存)
Redis 运维与场景124 条

缓存一致性(先写库还是先删缓存)

容忍短暂不一致的常规方案:更新数据库后删除缓存(Cache Aside);要求更强一致性时用延迟双删、订阅 binlog 或读主库策略。

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

延迟双删

延迟双删
def update(uid, data):
    redis.delete(f'user:{uid}')     # 1) 先删(可选)
    db.update(uid, data)            # 2) 写库
    time.sleep(0.5)                 # 3) 等读回填的并发窗口过去
    redis.delete(f'user:{uid}')     # 4) 再删一次

方案

方案一致性成本
先写库再删缓存秒级不一致可接受低(主流)
延迟双删更小窗口中(sleep 不优雅)
订阅 binlog 删除接近最终一致高(需要 CDC 链路)
强一致读主库一致回到数据库压力
讨论一致性前先定义「业务能容忍多久的旧数据」:缓存不是数据库,追求强一致通常要牺牲缓存的价值。

易错点

  • 「更新缓存」而不是删:并发写覆盖顺序错乱,产生长期脏数据
  • 删缓存失败没有补偿:需要重试队列或 binlog 兜底

数据来源与参考

  • Redis 官方文档: 缓存与一致性
  • CDC 实践(binlog 订阅)

相关工具

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