为了账号安全,请及时绑定邮箱和手机立即绑定

分布式的环境下, MySQL和Redis如何保持数据的一致性?

分布式的环境下, MySQL和Redis如何保持数据的一致性?

linux零基础学习视频 2018-03-05 09:27:25
一台MySQL,一台Redis,两台应用服务器,用户的数据存储持久化在MySQL中,缓存在Redis,有请求的时候从Redis中获取缓存的用户数据,有修改则同时修改MySQL和Redis中的数据。现在问题是:1. 先保存到MySQL和先保存到Redis都面临着一个保存成功而另外一个保存失败的情况,这样,如何保证MySQL与Redis中的数据同步?2. 两台应用服务器的并发访问,如何保证数据的安全性?
查看完整描述

5 回答

?
mark_fork

TA贡献11条经验 获得超10个赞

最初级的缓存不一致问题及解决方案:

楼主描述的方案,“先保存到MySQL和先保存到Redis都面临着一个保存成功而另外一个保存失败的情况”会导致 数据库中数据 与 redis中数据不一致的问题。

解决办法

采用 cache aside pattern 并发更新操作的时候可以先删除缓存,然后更新数据库。

此方案下的更新操作情况:

  1. 删除缓存失败,那么不会去执行update操作。

  2. 删除缓存成功,update失败,读请求还是会将旧值写回到redis中。

  3. 删除缓存成功,update成功,读请求会将新值写回到redis中。

复杂情况的解决办法:

一个update操作,在删除缓存成功,但update操作未提交的情况下,读请求会读取数据库中旧的值,至此缓存中是旧值,update后的数据库是新值,这种情况就应该采用异步读写请求队列去解决,简单言之,update请求入队列,读请求入队列,update操作未执行完之前,读操作被阻塞,但是读操作需要while循环 一段时间,因为一旦当前操作的读请求之前还有一个读请求在队列中,很可能前一个读请求已经将update后的新值已经读取到redis当中了。

查看完整回答
2 反对 回复 2018-03-15
?
安卓入门学习视频

TA贡献3条经验 获得超3个赞

缓存只做失效  不做更新

查看完整回答
2 反对 回复 2018-03-05
?
慕斯卡4083827

TA贡献1条经验 获得超1个赞

缓存只做失效,不做更新,支持

查看完整回答
1 反对 回复 2018-03-06
?
ajax入门学习视频

TA贡献5条经验 获得超0个赞

Redis只用作cache,写请求只交给MySQL处理。否则你就要自己去解决一个分布式事务的问题,这个目前还没有性价比高的解决方案。如果应用是write heavy的,请使用HBase和Cassandra

查看完整回答
反对 回复 2018-03-05
?
喵喵一只汪

TA贡献7条经验 获得超1个赞

如果要“保证”数据的安全性,那么会带来开销的进一步提升,以至于使用redis带来的性能优势都会丧失。正确的做法是区分不同的业务,使得并不需要“保证”数据一致性的场合,可以使用redis优化。而敏感的场合依然使用mysql

查看完整回答
反对 回复 2018-03-05
  • 5 回答
  • 4 关注
  • 13558 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信