5 回答

TA貢獻(xiàn)11條經(jīng)驗(yàn) 獲得超10個(gè)贊
最初級(jí)的緩存不一致問題及解決方案:
樓主描述的方案,“先保存到MySQL和先保存到Redis都面臨著一個(gè)保存成功而另外一個(gè)保存失敗的情況”會(huì)導(dǎo)致 數(shù)據(jù)庫(kù)中數(shù)據(jù) 與 redis中數(shù)據(jù)不一致的問題。
解決辦法
采用 cache aside pattern 并發(fā)更新操作的時(shí)候可以先刪除緩存,然后更新數(shù)據(jù)庫(kù)。
此方案下的更新操作情況:
刪除緩存失敗,那么不會(huì)去執(zhí)行update操作。
刪除緩存成功,update失敗,讀請(qǐng)求還是會(huì)將舊值寫回到redis中。
刪除緩存成功,update成功,讀請(qǐng)求會(huì)將新值寫回到redis中。
復(fù)雜情況的解決辦法:
一個(gè)update操作,在刪除緩存成功,但update操作未提交的情況下,讀請(qǐng)求會(huì)讀取數(shù)據(jù)庫(kù)中舊的值,至此緩存中是舊值,update后的數(shù)據(jù)庫(kù)是新值,這種情況就應(yīng)該采用異步讀寫請(qǐng)求隊(duì)列去解決,簡(jiǎn)單言之,update請(qǐng)求入隊(duì)列,讀請(qǐng)求入隊(duì)列,update操作未執(zhí)行完之前,讀操作被阻塞,但是讀操作需要while循環(huán) 一段時(shí)間,因?yàn)橐坏┊?dāng)前操作的讀請(qǐng)求之前還有一個(gè)讀請(qǐng)求在隊(duì)列中,很可能前一個(gè)讀請(qǐng)求已經(jīng)將update后的新值已經(jīng)讀取到redis當(dāng)中了。

TA貢獻(xiàn)3593條經(jīng)驗(yàn) 獲得超0個(gè)贊

TA貢獻(xiàn)5條經(jīng)驗(yàn) 獲得超0個(gè)贊
Redis只用作cache,寫請(qǐng)求只交給MySQL處理。否則你就要自己去解決一個(gè)分布式事務(wù)的問題,這個(gè)目前還沒有性價(jià)比高的解決方案。如果應(yīng)用是write heavy的,請(qǐng)使用HBase和Cassandra

TA貢獻(xiàn)7條經(jīng)驗(yàn) 獲得超1個(gè)贊
如果要“保證”數(shù)據(jù)的安全性,那么會(huì)帶來開銷的進(jìn)一步提升,以至于使用redis帶來的性能優(yōu)勢(shì)都會(huì)喪失。正確的做法是區(qū)分不同的業(yè)務(wù),使得并不需要“保證”數(shù)據(jù)一致性的場(chǎng)合,可以使用redis優(yōu)化。而敏感的場(chǎng)合依然使用mysql
添加回答
舉報(bào)