回答 #1 · 01:24
先明确一致性要求,再选择更新策略。
1. 先确认业务允许多长时间的旧数据
缓存与数据库是两个独立存储,双写之间会有时间窗口。商品介绍可以接受短暂延迟,库存扣减和支付状态通常需要更严格的校验。先明确场景,再决定是否适合从缓存读取。
2. 常见做法:先更新数据库,再删除缓存
读取时先查缓存,未命中再查数据库并回填。更新时先完成数据库事务,再让缓存失效,下一次读取重新加载。选择删除而不是直接更新,可以减少并发写入乱序导致缓存被旧值覆盖的风险。
3. 为删除失败和并发回填准备恢复机制
删除失败需要可追踪的重试任务,配合重试次数、退避和告警;TTL 用于限制旧值存活时间。还要考虑读取旧数据后才完成回填的并发场景,必要时使用版本校验或基于变更日志的失效机制。
4. 面试时说明保证范围与验证方法
这类方案通常追求最终一致,不能仅凭“加了过期时间”就承诺强一致。可以用并发读写测试、失败注入、重试积压监控和不一致窗口观测验证效果;强一致场景需要重新审视是否使用缓存。
继续追问会保留当前上下文,再生成下一轮回答。