延迟双删 (Delayed Double Delete) 是一种在更新数据库后,通过“立即删除 + 延迟再次删除”缓存的组合拳,来彻底解决主从延迟导致脏数据回填的增强方案。
核心逻辑
该方案是 旁路缓存 (Cache Aside) 的增强版。它在标准的“先更库再删缓存”基础上,增加了一次延迟删除。
| 步骤 | 操作 | 目的 |
|---|---|---|
| 1. 更 | 更新数据库 | 修改业务数据(主库) |
| 2. 删 | 立即删除缓存 | 使缓存失效,后续读请求触发回填 |
| 3. 延 | 休眠一小段时间 (如 500ms) | 等待主从同步完成 |
| 4. 删 | 再次删除缓存 | 清理在主从同步期间因读请求产生的脏数据 |
sequenceDiagram participant App as 应用程序 participant Redis as 缓存 participant Master as 主库 (Write) participant Slave as 从库 (Read) App->>Master: 1. 更新数据库 App->>Redis: 2. 立即删除缓存 Note over Master, Slave: 主从同步中 (存在延迟) rect rgb(240, 240, 240) Note right of Slave: 此时读请求可能从从库读到旧值并回填缓存 end App->>App: 3. 休眠 (如 500ms) App->>Redis: 4. 再次删除缓存 (清理脏数据)
痛点与对策
| 挑战 | 技术对策 |
|---|---|
| 延迟时间难确定 | 需大于“主从同步延迟 + 读请求回填缓存”的时间总和 |
| 吞吐量下降 | 异步化处理第二次删除(如通过线程池或 MQ 延迟队列) |
| 极端并发失效 | 配合过期时间 (TTL) 兜底,或升级为 异步补偿 方案 |