缓存全景图
Pre
分布式缓存:缓存设计中的 7 大经典问题_缓存失效、缓存穿透、缓存雪崩
缓存设计中的 7 大经典问题
接下来将对缓存设计中的 7 大经典问题,
一、数据不一致
1. 问题描述
当一份数据同时存在于数据库和缓存中时,如果两者数据不同步,便会产生“数据不一致”问题。进一步地,若采用多缓存副本(例如多机房或多节点复制),各副本间的数据也可能因为更新不完全而出现差异。
2. 原因分析
- 更新异常:先写库后更新缓存时,若缓存更新失败,缓存会保留旧值。
- 一致性哈希重平衡:采用一致性哈希并开启自动 rehash 漂移策略时,多次节点上下线可能导致部分键迁移过程中未及时写入新节点。
- 副本更新失败:多副本架构下,某些副本更新异常,也会造成个别副本的脏数据。
3. 业务场景
![ ’ ';/;
- 网络波动或带宽饱和:缓存机房网络不稳定时,更新请求可能丢失。
- 节点频繁重启:缓存集群 rehash 过程中,某节点反复上下线,使部分更新只生效于部分节点。
4. 解决方案
-
更新失败重试+补偿队列
- 在写库后,若写缓存失败,立即进行 N 次重试;
- 若仍失败,将失败的 key 写入消息队列;
- 缓存恢复后,后台消费队列,删除这些 key;
- 下一次命中时,由 Cache Aside 机制从 DB 重新加载,保证最终一致性。
-
缩短缓存有效期
- 合理调低 TTL,使缓存数据更快过期;
- 依赖过期后重新加载的方式,实现“最终一致性”保障。
-
分层缓存替代 Rehash
- 取消自动 rehash 漂移策略;
- 采用本地 + 全局两级缓存架构,减少数据迁移带来的脏读风险。
二、数据并发竞争
1. 问题描述
高并发场景下,若缓存正好 miss(例如过期、被淘汰),海量请求会同时打到数据库,导致数据库压力骤增,甚至雪崩。
2. 业务场景
- 车票/大促抢购系统:某车次/商品缓存失效后,仍有大量用户查询。
- 社交媒体热度内容:热门微博被淘汰时,继续有大量点赞、评论、转发请求。
3. 解决方案
-
全局锁(或分布式锁)
- 缓存 miss 后,先尝试获取与该 key 关联的全局锁;
- 加锁成功者访问 DB 加载数据并回写缓存;
- 其余请求若见锁已存在,则等待或自旋,待缓存回填后再读取。
-
多备份缓存
- 对关键数据在不同缓存节点或不同缓存系统中保留多份;
- 单个副本过期/淘汰时,其他副本仍可命中,避免热点数据失效引发的“穿透”。
三、小结
- 数据不一致与并发竞争是典型的缓存痛点,解决手段需结合系统特点、成本与复杂度来选型;
- 对于强一致性场景,可优先考虑更新补偿与分布式事务;
- 对于超高读并发场景,锁与多备份方案可以互补使用,以兼顾性能与可用性。