1. Cache-Aside 下先更新数据库再删缓存为什么是主流方案?延迟双删和订阅 binlog(Canal)方案分别解决什么残留问题?
请说明 Cache-Aside 模式下先更新数据库再删缓存为什么是主流方案,以及延迟双删和订阅 binlog(Canal)方案分别解决什么残留问题?
- Cache-Aside 的读写流程
- 先更新 DB 再删缓存的优势
- 延迟双删与 Canal 的残留问题
Cache-Aside 中,读先查缓存,未命中则查库回填;写时先更新数据库,再删除缓存。主流方案是"先更新 DB 再删缓存"而非"先删缓存再更新 DB",因为先删缓存再更新 DB 的窗口期,并发读会读到旧数据库值并回填旧缓存,造成脏数据。而先更新 DB 再删缓存,即使删缓存失败,也只是短暂读到旧缓存,DB 已是最新。残留问题:删除缓存失败或并发读写交错仍可能产生不一致,延迟双删(先删缓存、更新 DB、延迟后再删一次)解决"更新后立即有读回填旧值"的残留;订阅 binlog(Canal)通过监听 DB binlog 异步删除缓存,解决删除失败重试与缓存一致性问题。
"先 DB 后删缓存"把不一致窗口缩到最小,且删缓存幂等(删除失败可重试)。延迟双删与 Canal 是进一步消除"删除失败/竞态"导致的残留脏数据,Canal 提供了可靠异步删除的兜底。