在实现旁路缓存(Cache Aside)的写策略时,更新数据库和操作缓存的顺序至关重要。
情况 A:先删缓存,再更数据库
这种顺序存在明显的一致性风险。
失效场景:
- 线程 A 删除了缓存。
- 线程 B 发起读请求,发现缓存失效,去读数据库(此时 A 还没更新完,B 读到的是旧值)。
- 线程 B 将读到的旧值写入缓存。
- 线程 A 完成数据库更新。
结果:缓存中永远留存了旧的脏数据,直到该 Key 过期。在并发较高的环境下,这种情况发生的概率非常大。
情况 B:先更数据库,再删缓存(推荐)
这是目前工业界的主流实践,其一致性风险极低。
理论上的风险点:
- 缓存刚好失效。
- 线程 B 去数据库读旧值。
- 线程 A 更新数据库并删缓存(此时缓存本就是空的)。
- 线程 B 将旧值写入缓存。
为什么风险极低? 因为步骤 4 必须发生在步骤 3 之后才会产生脏数据。然而,数据库的写操作(更新 DB)通常比读操作慢得多。要让线程 B 的“读+写缓存”跨越线程 A 的“写数据库+删缓存”全过程是非常困难的。
因此,先更库再删缓存是更安全的选择。