在旁路缓存(Cache Aside Pattern)的写操作中,我们通常选择 删除(Delete) 缓存,而不是更新(Update)缓存。主要基于以下两个维度的考量:

一、性能开销

缓存中的数据有时并不是数据库表中的原样拷贝,而是经过复杂的计算、聚合得到的。

  • 计算资源浪费:如果每次数据库更新都要重新计算并更新缓存,会浪费大量的 CPU 和内存资源。
  • 懒加载优势:如果该缓存数据并不一定会被频繁访问(冷数据),删除操作可以确保只有在真正需要时才进行计算(Lazy Loading),提高空间利用率。

二、并发安全(数据一致性)

在高并发场景下,多个写请求同时更新缓存可能会导致脏数据

竞争条件示例:

  1. 线程 A 更新数据库。
  2. 线程 B 更新数据库。
  3. 线程 B 更新缓存。
  4. 线程 A 更新缓存。

结果:数据库中存储的是线程 B 的最新值,而缓存中存储的却是线程 A 的旧值。这种由于写操作乱序导致的不一致,在“删除缓存”策略下是不存在的,因为删除操作是幂等的,且后续读请求会强制从数据库拉取最新数据。