跳转至

Redis 和 MySQL 双写一致性

一、问题

更新数据库,缓存也要更新,否则不一致。

二、方案

1. 先更新 DB,再删缓存

最常用。

为什么删而不是更新缓存: - 更新缓存可能并发覆盖。 - 懒加载,下次查询才重建。

2. 延迟双删

update DB;
delete cache;
Thread.sleep(500);
delete cache;

解决并发读旧数据写回缓存。

3. Canal + MQ

监听 binlog,异步删缓存。

三、其他方案问题

先删缓存再更新 DB

读请求刚好在删缓存后、更新 DB 前读,会把旧数据写回缓存。

更新缓存

并发更新,顺序不对,缓存数据错。

四、为什么用延迟双删

  • 简单。
  • 大多数场景够用。

五、最终一致

强一致做不到,最终一致就行。

一句话

先更新 DB 再删缓存,延迟双删防并发。