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

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

阅读 8.2k
8 个回答

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

通行的做法是重试+补偿

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

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

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

如果没有要求数据达到完全的准确性,是可以做这种操作的。像微信对订单的并发处理是采用多表多库

1、先存数据库,再同步/异步刷到缓存中,像mysql可以用触发器刷到redis中

2、先读缓存,缓存中没有,再查询数据库

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

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

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

写入:

写DB -> 删除redis

查询:

查redis -> 查不到,查DB -> 写入redis -> 返回数据
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题