标准答案
- 常见流程是在写前或写后删除一次缓存,数据库更新完成后再延迟删除一次,目标是清掉并发读在旧数据库快照下回填的旧缓存。
- 延迟时间必须覆盖典型读请求、数据库更新和缓存回填的时间,但线上存在长尾、暂停、重试和网络抖动,任何固定延迟都不能严格覆盖全部情况。
- 它适合可接受短暂最终一致、读写竞争窗口明确且有监控的场景;对库存扣减、余额、权限等强约束对象,应依赖条件更新、版本号或主库校验。
- 如果采用延迟双删,第二次删除也必须可靠执行,应放进可观测任务或消息机制,而不是在请求线程里 sleep 后随手调用。
题目解析
延迟双删是一种补救性策略,不是通用理论。它只能缩短旧值被回填后的停留时间,无法解决事件丢失、多个写者乱序或缓存服务故障。
更稳的设计是明确数据版本、失效事件和读写路径:读到的缓存版本落后于事实版本时不再使用,而不是猜一个等待时长。
常见误区
- 把延迟设置成固定几百毫秒后就宣称缓存强一致。
- 在 Web 请求里阻塞等待第二次删除,浪费线程并增加响应时间。