如何保证缓存的一致性?

常见的解决方案:

1. 先更新数据库后,再更新缓存

    如果数据库更新成功,缓存更新失败。那么我们在缓存失效之前,读取到的一直都是老数据,而数据库里面是新数据

2. 先更新缓存,再更新数据库

    如果缓存更新失败,数据库更新成功。导致我们读取到的一直都是错误的缓存值

******************以上两种方案均不可取,无法原子性,所以不要选择更新缓存的操作***************

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

    实际中有一定的使用量,即使更新数据库失败也没有问题,数据都是老的。
    不过在高并发下会有问题,比如线程A删除缓存后,正在更新数据库时,这个时候线程B来查询缓存,发现缓存为空,就把数据库中的老数据写到缓存。导致缓存中存在的一直是老数据。
    针对以上的高并发条件下的问题,我们可以采取双删的策略。先删除缓存,再更新数据库,再删除缓存。
    

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

    这种是比较流行的做法,支持高并发。这种做法的关键是要保证数据库更新完以后,缓存的删除必须保证成功。
    以下两种方案可以应对缓存的删除失败:
        1.消息队列补偿             删除失败的消息打入队列,监听队列,再次重试执行
        2.用canal监听binlog     当mysql的数据发生变化后,canal会收到一条消息,这个时候进行删除。好处是可以代码解耦,减少业务的复杂度。并且中间件保证了我们的高可用性。


Canal:https://blog.csdn.net/wt334502157/article/details/119763273    

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值