← 返回首页
如何保证数据库和缓存的双写一致性?
没有完美的方案,只有最适合业务的权衡:
先删缓存,再更新数据库:绝对不行,高并发下会读到旧数据(脏数据)。
先更新数据库,再删缓存 (Cache Aside Pattern):推荐方案。
绝大多数场景够用。极端情况下(读请求在删缓存前介入,且查到了旧数据写入缓存)会有短暂不一致,但概率极低。
延时双删:
先删缓存 -> 更新 DB -> 休眠 N 毫秒 -> 再删缓存。解决上述极端情况,但增加了延迟和复杂度。
监听 Binlog 异步删除:
更新 DB -> Canal 监听 Binlog -> 发送消息到 MQ -> 消费者删除缓存。解耦,可靠性高,适合对一致性要求较高的场景。
强一致性场景:
直接不使用缓存,或使用 分布式锁 串行化读写(牺牲性能)。