在旁路缓存(Cache Aside Pattern)的写操作中,我们通常选择 删除(Delete) 缓存,而不是更新(Update)缓存。主要基于以下两个维度的考量:
一、性能开销
缓存中的数据有时并不是数据库表中的原样拷贝,而是经过复杂的计算、聚合得到的。
- 计算资源浪费:如果每次数据库更新都要重新计算并更新缓存,会浪费大量的 CPU 和内存资源。
- 懒加载优势:如果该缓存数据并不一定会被频繁访问(冷数据),删除操作可以确保只有在真正需要时才进行计算(Lazy Loading),提高空间利用率。
二、并发安全(数据一致性)
在高并发场景下,多个写请求同时更新缓存可能会导致脏数据。
竞争条件示例:
- 线程 A 更新数据库。
- 线程 B 更新数据库。
- 线程 B 更新缓存。
- 线程 A 更新缓存。
结果:数据库中存储的是线程 B 的最新值,而缓存中存储的却是线程 A 的旧值。这种由于写操作乱序导致的不一致,在“删除缓存”策略下是不存在的,因为删除操作是幂等的,且后续读请求会强制从数据库拉取最新数据。