缓存是后端性能优化的关键手段,但在分布式架构中,缓存一致性问题是常见隐患。若处理不当,会出现脏读、数据过期、双写冲突等问题。
1. 一致性问题的来源
- 多节点缓存副本:不同节点缓存同一数据,更新时延迟不同。
- 数据库与缓存双写:写入数据库后未同步更新缓存。
- 并发更新:多个线程同时修改数据,覆盖最新值。
2. 常见策略
-
Cache Aside(旁路缓存)模式
- 读:先读缓存,未命中则读数据库并回写缓存。
- 写:先更新数据库,再删除缓存。
- 适合读多写少的场景。
- 缺点:存在短暂不一致。
-
Read/Write Through 模式
- 应用通过缓存层间接操作数据库。
- 一致性强,但依赖中间层实现。
-
Write Behind 模式
- 写入先更新缓存,再异步写入数据库。
- 高性能,但一致性弱。
3. 双写不一致的解决方案
- 写数据库成功 → 删除缓存(而非更新缓存)。
- 通过消息队列异步清除缓存,保证最终一致。
- 使用版本号或时间戳控制写入顺序。
4. 分布式锁控制更新
- Redis
SETNX或 Redisson 实现互斥更新。 - 避免多线程同时修改缓存。
5. 延迟双删策略
- 删除缓存 → 更新数据库 → 延迟几百毫秒再删一次缓存。
- 避免并发读取脏数据。
6. 实践建议
- 缓存失效时间随机化,防止雪崩。
- 尽量采用“删缓存”而非“更新缓存”。
- 重要数据场景引入一致性校验机制。
结论:缓存一致性无法完美解决,只能在一致性与性能间取平衡。掌握删除策略与延迟补偿,是工程可行解。