redis与mysql双写数据不一致问题

4 篇文章 0 订阅
3 篇文章 0 订阅
本文分析了三种数据库更新与缓存同步的策略:先更新数据库再更新缓存、先删除缓存再更新数据库以及先更新数据库再删除缓存。每种策略都存在线程安全问题,并可能导致数据不一致。延时双删策略被提出以优化问题,但即使如此,仍有可能出现极低概率的数据不一致情况。对于写多读少的场景,需要权衡性能与一致性之间的平衡。
摘要由CSDN通过智能技术生成

三种更新策略:

先更新数据库,再更新缓存(线程不安全)

1、线程A更新了数据库;

2、线程B更新了数据库;

3、线程B更新了缓存;

4、线程A更新了缓存;

数据库是B写入的值,而缓存中是A写入的旧值

  写多读少的场景,频繁写缓存很浪费性能;


先删缓存,再更新数据库(线程不安全)

1、线程A删除了缓存;

2、线程B查询缓存发现不存在;

3、线程B更新了缓存;

4、线程A写入了数据库;

数据库是A写入的值,而缓存中是B写入的旧值

可以使用延时双删策略进行优化;

延时双删:

  1. 先删除缓存;
  2. 再写入数据库;
  3. 异步发消息,再去删除一次缓存;

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

这种方案最好,但是有极低的概率会发生不一致的情况;

1、缓存刚好失效;

2、线程A去数据库读取数据;

3、线程B写入数据库;

4、线程B删除缓存;

5、线程A写入缓存;

数据库中是B写入的新值,而缓存中是A写入的旧值

PS:这种情况发生的概率极低,因为读取数据库到写入缓存所花费的时间应该远远低于B操作的时间,如果真的发生了,用发消息来删除的方案也可以解决;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值