如果我有一份数据,存储到mysql和redis,有什么方法保持数据一致性,如果保存到mysql成功了,但是保存redis失败了,怎么保持这个两个地方的数据时一致的哪?我做过这种,就是当redis存储失败了,会保存到一张表里,然后由一个job定时去跑这些数据在补进redis,补完删除,但还是会发现有的数据没有存到redis,各位大神有什么好方法吗
8 回答
12345678_0001
TA贡献1802条经验 获得超5个赞
没有一种方法可以保证分布式操作的一致性。
通行的做法是重试+补偿。
题主所说的,当redis存储失败了,会保存到一张表里,这是一种补偿机制,但也不能确保保存到表是成功的。
更简单的做法是在读取而不是保存时做补偿,即允许缓存写入失败,当缓存没读到时,去访问数据库(所谓击穿),当缓存没读到的情况很多时(确实是没有数据,而不是写入失败),可以考虑做成negative cache。
Qyouu
TA贡献1786条经验 获得超11个赞
可以监听 mysql binlog
的变化再同步到redis。但是我觉得没有必要这么做,一般出现你说的情况,不是程序有bug,就是服务不可用或者链接超时,可以记到日志里等服务恢复再处理。没必要在引入复杂的机制来保证mysql 和 redis 的数据一致。
添加回答
举报
0/150
提交
取消