Skip to content

数据库与缓存的一致性 ​

来源:语雀原文 | 整理日期:2026-09-22

1.1读取数据 ​

逻辑如下:

image.png

1.2写数据流程 ​

先删除缓存在更新数据库

先更新数据库在删除缓存

先操作缓存

image.png

数据库不一致

image.png

解决办法:延迟双删

1.先删除缓存。

2.写数据库。

3.休眠多少毫秒,在删除缓存。

这样子最多其他线程在这个时间段读取的脏数据。

image.png

注意:咱们用redis一定是为了提供性能,所以这里的所有方案都是最终一致性,允许短暂的不一致,如果非要强一致,那就不要用缓存或者直接加锁

先操作数据库

image.png

数据不一致

image.png

假如在删除缓存的失败,那就用重试级制

比如重试三次,三次都失败则记录日志到数据库并发送警告让人工介入。

在高并发的场景下,重试最好使用的异步方式,比如发送消息到mq中间件,实现异步解耦。

image.png

总结: ​

1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致,可以给缓存数据加上过期时间,每隔一段时间触发读的主动更新即可。

2、就算并发很高,如果业务上能容忍短时间的缓存数据不一致(如商品名称,商品分类菜单等),缓存加上过期时间依然可以解决大部分业务对于缓存的要求。

3、如果不能容忍缓存数据不一致,可以通过加分布式读写锁保证并发读写或写写的时候按顺序排好队,读读的时候相当于无锁。

4、也可以用阿里开源的canal通过监听数据库的binlog日志及时的去修改缓存,但是引入了新的中间件,增加了系统的复杂度。

image.png