Redis · 主观题 · 第 48 题
Java 后端开发面试 · 第 48 题
如何保证 Redis 缓存与数据库的数据一致性?
参考答案
1. 常用方案是 Cache Aside(旁路缓存):读时先读缓存,未命中就读数据库再写回缓存;写时先更新数据库,再删除缓存。
2. 为什么删缓存而不是更新缓存:并发写时,更新缓存容易乱序导致脏数据,而且有些缓存值计算成本高,删掉后按需重建更省。
3. 为什么先更新数据库再删缓存:如果先删缓存,在更新数据库之前,其他读请求会把旧值重新写回缓存。
4. 剩余的不一致窗口:删除缓存失败、读写交错导致旧值回填。对策是删除失败时通过消息队列重试;订阅 binlog(如 Canal)异步删缓存;延迟双删;缓存始终设置过期时间作为兜底。
5. 强一致需求:加分布式锁或读写锁,或者不使用缓存;多数业务接受最终一致。
解析
Cache Aside 的读写流程和两个「为什么」是核心。