如何保证Redis缓存和数据库一致性?

  • 先删除缓存,再更新数据库

在「先删除缓存,再更新数据库」方案下,2 个线程要并发「读写」数据,可能会发生以下场景:

  1. 线程 A 要更新 X = 2(原值 X = 1)

  1. 线程 A 先删除缓存

  1. 线程 B 读缓存,发现不存在,从数据库中读取到旧值(X = 1)

  1. 线程 A 将新值写入数据库(X = 2)

  1. 线程 B 将旧值写入缓存(X = 1)

最终 X 的值在缓存中是 1(旧值),在数据库中是 2(新值),发生不一致。

解决方案:在线程 A 删除缓存、更新完数据库之后,先「休眠一会」,再「删除」一次缓存。

延迟时间要大于线程 B 读取数据库 + 写入缓存的时间

  • 先更新数据库,再删除缓存

在「先更新数据库,再删除缓存」方案下,「读写分离 + 主从库延迟」其实也会导致不一致:

  1. 线程 A 更新主库 X = 2(原值 X = 1)

  1. 线程 A 删除缓存

  1. 线程 B 查询缓存,没有命中,查询「从库」得到旧值(从库 X = 1)

  1. 从库「同步」完成(主从库 X = 2)

  1. 线程 B 将「旧值」写入缓存(X = 1)

最终 X 的值在缓存中是 1(旧值),在主从库中是 2(新值),也会发生不一致。

解决方案:线程 A 可以生成一条「延时消息」,写到消息队列中,消费者延时「删除」缓存。

延迟时间要大于「主从复制」的延迟时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值