实现缓存最终一致性的两种方案

  一、重客户端

  写入缓存:

  


  应用同时更新数据库和缓存

  如果数据库更新成功,则开始更新缓存,否则如果数据库更新失败,则整个更新过程失败。

  判断更新缓存是否成功,如果成功则返回

  如果缓存没有更新成功,则将数据发到MQ中

  应用监控MQ通道,收到消息后继续更新Redis。

  问题点:如果更新Redis失败,同时在将数据发到MQ之前的时间,应用重启了,这时候MQ就没有需要更新的数据,如果Redis对所有数据没有设置过期时间,同时在读多写少的场景下,只能通过人工介入来更新缓存。

  读缓存:

  如何来解决这个问题?那么在写入Redis数据的时候,在数据中增加一个时间戳插入到Redis中。在从Redis中读取数据的时候,首先要判断一下当前时间有没有过期,如果没有则从缓存中读取,如果过期了则从数据库中读取最新数据覆盖当前Redis数据并更新时间戳。具体过程如下图所示:

  

  二、客户端数据库与缓存解耦

  上述方案对于应用的研发人员来讲比较重,需要研发人员同时考虑数据库和Redis是否成功来做不同方案,如何让研发人员只关注数据库层面,而不用关心缓存层呢?请看下图:

  


  应用直接写数据到数据库中。

  数据库更新binlog日志。

  利用Canal中间件读取binlog日志。

  Canal借助于限流组件按频率将数据发到MQ中。

  应用监控MQ通道,将MQ的数据更新到Redis缓存中。

  可以看到这种方案对研发人员来说比较轻量,不用关心缓存层面,而且这个方案虽然比较重,但是却容易形成统一的解决方案。


转载于:https://juejin.im/post/5c4833ca518825255d298b6f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值