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

如果我有一份数据,存储到mysql和redis,有什么方法保持数据一致性

如果我有一份数据,存储到mysql和redis,有什么方法保持数据一致性

POPMUISE 2019-02-22 19:36:20
如果我有一份数据,存储到mysql和redis,有什么方法保持数据一致性,如果保存到mysql成功了,但是保存redis失败了,怎么保持这个两个地方的数据时一致的哪?我做过这种,就是当redis存储失败了,会保存到一张表里,然后由一个job定时去跑这些数据在补进redis,补完删除,但还是会发现有的数据没有存到redis,各位大神有什么好方法吗
查看完整描述

8 回答

?
12345678_0001

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

没有一种方法可以保证分布式操作的一致性。

通行的做法是重试+补偿

题主所说的,当redis存储失败了,会保存到一张表里,这是一种补偿机制,但也不能确保保存到表是成功的。

更简单的做法是在读取而不是保存时做补偿,即允许缓存写入失败,当缓存没读到时,去访问数据库(所谓击穿),当缓存没读到的情况很多时(确实是没有数据,而不是写入失败),可以考虑做成negative cache。

查看完整回答
反对 回复 2019-03-01
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

如果说redis仅仅是作为缓存,
那么,
我会优先必须百分之百保证mysql数据成功,至于redis不做强求。

查看完整回答
反对 回复 2019-03-01
?
鸿蒙传说

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

mysql和redis两者都具有事务的啊,两者都使用事务的话,一旦其中一方错误都将双方rollback不可以吗?

查看完整回答
反对 回复 2019-03-01
?
Qyouu

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

可以监听 mysql binlog 的变化再同步到redis。但是我觉得没有必要这么做,一般出现你说的情况,不是程序有bug,就是服务不可用或者链接超时,可以记到日志里等服务恢复再处理。没必要在引入复杂的机制来保证mysql 和 redis 的数据一致。

查看完整回答
反对 回复 2019-03-01
?
动漫人物

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

你这只能自己做一致性(最终一致性)这不就是数据同步吗

查看完整回答
反对 回复 2019-03-01
?
森栏

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

写入:

写DB -> 删除redis

查询:

查redis -> 查不到,查DB -> 写入redis -> 返回数据
查看完整回答
反对 回复 2019-03-01
  • 8 回答
  • 0 关注
  • 626 浏览

添加回答

举报

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