如果我有一份数据,存储到mysql和redis,有什么方法保持数据一致性,如果保存到mysql成功了,但是保存redis失败了,怎么保持这个两个地方的数据时一致的哪?我做过这种,就是当redis存储失败了,会保存到一张表里,然后由一个job定时去跑这些数据在补进redis,补完删除,但还是会发现有的数据没有存到redis,各位大神有什么好方法吗
如果我有一份数据,存储到mysql和redis,有什么方法保持数据一致性,如果保存到mysql成功了,但是保存redis失败了,怎么保持这个两个地方的数据时一致的哪?我做过这种,就是当redis存储失败了,会保存到一张表里,然后由一个job定时去跑这些数据在补进redis,补完删除,但还是会发现有的数据没有存到redis,各位大神有什么好方法吗
如果没有要求数据达到完全的准确性,是可以做这种操作的。像微信对订单的并发处理是采用多表多库
1、先存数据库,再同步/异步刷到缓存中,像mysql可以用触发器刷到redis中
2、先读缓存,缓存中没有,再查询数据库
可以监听 mysql binlog
的变化再同步到redis。但是我觉得没有必要这么做,一般出现你说的情况,不是程序有bug,就是服务不可用或者链接超时,可以记到日志里等服务恢复再处理。没必要在引入复杂的机制来保证mysql 和 redis 的数据一致。
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
2 回答2.8k 阅读✓ 已解决
没有一种方法可以保证分布式操作的一致性。
通行的做法是重试+补偿。
题主所说的,当redis存储失败了,会保存到一张表里,这是一种补偿机制,但也不能确保保存到表是成功的。
更简单的做法是在读取而不是保存时做补偿,即允许缓存写入失败,当缓存没读到时,去访问数据库(所谓击穿),当缓存没读到的情况很多时(确实是没有数据,而不是写入失败),可以考虑做成negative cache。