鍍金池/ 問答/人工智能  Java  數(shù)據(jù)庫/ 如果我有一份數(shù)據(jù),存儲到mysql和redis,有什么方法保持數(shù)據(jù)一致性

如果我有一份數(shù)據(jù),存儲到mysql和redis,有什么方法保持數(shù)據(jù)一致性

如果我有一份數(shù)據(jù),存儲到mysql和redis,有什么方法保持數(shù)據(jù)一致性,如果保存到mysql成功了,但是保存redis失敗了,怎么保持這個兩個地方的數(shù)據(jù)時一致的哪?我做過這種,就是當redis存儲失敗了,會保存到一張表里,然后由一個job定時去跑這些數(shù)據(jù)在補進redis,補完刪除,但還是會發(fā)現(xiàn)有的數(shù)據(jù)沒有存到redis,各位大神有什么好方法嗎

回答
編輯回答
亮瞎她

JAVA通過Gearman實現(xiàn)MySQL到Redis的數(shù)據(jù)同步(異步復制)
https://my.oschina.net/u/3385...
可以試試這種方式

2017年12月17日 05:54
編輯回答
單眼皮

mysql和redis兩者都具有事務的啊,兩者都使用事務的話,一旦其中一方錯誤都將雙方rollback不可以嗎?

2018年3月26日 10:46
編輯回答
絯孑氣

你這只能自己做一致性(最終一致性)這不就是數(shù)據(jù)同步嗎

2017年11月3日 01:29
編輯回答
雅痞

寫入:

寫DB -> 刪除redis

查詢:

查redis -> 查不到,查DB -> 寫入redis -> 返回數(shù)據(jù)
2017年11月30日 22:39
編輯回答
喵小咪

可以監(jiān)聽 mysql binlog 的變化再同步到redis。但是我覺得沒有必要這么做,一般出現(xiàn)你說的情況,不是程序有bug,就是服務不可用或者鏈接超時,可以記到日志里等服務恢復再處理。沒必要在引入復雜的機制來保證mysql 和 redis 的數(shù)據(jù)一致。

2017年1月26日 21:15
編輯回答
爆扎

如果沒有要求數(shù)據(jù)達到完全的準確性,是可以做這種操作的。像微信對訂單的并發(fā)處理是采用多表多庫

1、先存數(shù)據(jù)庫,再同步/異步刷到緩存中,像mysql可以用觸發(fā)器刷到redis中

2、先讀緩存,緩存中沒有,再查詢數(shù)據(jù)庫

2018年5月10日 07:24
編輯回答
裸橙

如果說redis僅僅是作為緩存,
那么,
我會優(yōu)先必須百分之百保證mysql數(shù)據(jù)成功,至于redis不做強求。

2018年1月17日 02:08
編輯回答
逗婦乳

沒有一種方法可以保證分布式操作的一致性。

通行的做法是重試+補償。

題主所說的,當redis存儲失敗了,會保存到一張表里,這是一種補償機制,但也不能確保保存到表是成功的。

更簡單的做法是在讀取而不是保存時做補償,即允許緩存寫入失敗,當緩存沒讀到時,去訪問數(shù)據(jù)庫(所謂擊穿),當緩存沒讀到的情況很多時(確實是沒有數(shù)據(jù),而不是寫入失?。?,可以考慮做成negative cache。

2018年5月7日 12:44