缓存不一致问题,是指缓存中的数据与数据库中的数据不匹配的现象。当数据库中的数据发生更新后,若缓存未能及时同步更新或删除,就会导致后续读取缓存时获取到旧数据,从而引发业务逻辑错误。
缓存不一致的核心原因
缓存与数据库是两个独立的存储组件,数据更新时若两者的操作不同步,就可能产生不一致。常见场景包括:
先更新数据库,再更新缓存
- 问题:若第一步(更新数据库)成功,但第二步(更新缓存)失败(如网络故障、缓存服务宕机),则缓存中仍为旧数据,导致不一致。
先更新数据库,再删除缓存
- 问题:理论上比“更新缓存”更可靠(避免缓存更新失败),但仍可能因并发操作出问题。
例如:- 线程A更新数据库(旧值→新值)→ 尚未删除缓存;
- 线程B读取数据,此时缓存未删,读取到旧值并返回;
- 线程A再删除缓存,后续请求会从数据库加载新值到缓存,但线程B已返回旧值,造成短暂不一致。
- 问题:理论上比“更新缓存”更可靠(避免缓存更新失败),但仍可能因并发操作出问题。
先删除缓存,再更新数据库
- 问题:若删除缓存后,数据库更新前有其他线程读取数据,会加载旧数据到缓存。
例如:- 线程A删除缓存 → 准备更新数据库;
- 线程B读取数据,发现缓存为空,从数据库读取旧值并写入缓存;
- 线程A更新数据库为新值,此时缓存中是线程B写入的旧值,导致长期不一致。
- 问题:若删除缓存后,数据库更新前有其他线程读取数据,会加载旧数据到缓存。
缓存不一致的危害
- 业务逻辑错误:如电商商品价格缓存未更新,用户看到的价格与实际结算价不符,引发客诉。
- 数据决策偏差:如统计系统依赖缓存中的旧数据,导致报表错误,影响运营决策。
- 系统信任度下降:用户频繁遇到“数据错乱”(如已付款订单显示未支付),会降低对系统的信任。
与缓存穿透/击穿/雪崩的区别
- 缓存穿透、击穿、雪崩是“缓存未命中”导致的性能或可用性问题(请求冲击数据库);
- 缓存不一致是“缓存命中但数据错误”导致的业务逻辑问题(数据准确性受影响)。
解决缓存不一致的核心思路是保证“数据库更新”与“缓存操作”的原子性(要么都成功,要么都失败),或通过延迟重试、加锁等机制减少不一致的概率。具体解决方案会根据业务场景(如数据实时性要求、并发量)有所不同。