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

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

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

回答
編輯回答
亮瞎她

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

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

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

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

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

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

寫入:

寫DB -> 刪除redis

查詢:

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

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

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

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

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

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

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

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

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

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

通行的做法是重試+補(bǔ)償。

題主所說的,當(dāng)redis存儲失敗了,會保存到一張表里,這是一種補(bǔ)償機(jī)制,但也不能確保保存到表是成功的。

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

2018年5月7日 12:44