mysql和redis雙寫(xiě)一致性問(wèn)題
今天閱讀了一下關(guān)于mysql和redis雙寫(xiě)一致性問(wèn)題的幾個(gè)回答。整理下自己的理解
首先要先了解什么是一致性
強(qiáng)一致性:寫(xiě)入什么,讀取就是什么
弱一致性:寫(xiě)入之后,經(jīng)過(guò)一定時(shí)間級(jí)別,數(shù)據(jù)達(dá)到一致
最終一致性:弱一致性的特例,在一定時(shí)間內(nèi)達(dá)到一致
由于CAP原理即一致性,可用性和分區(qū)容錯(cuò)性無(wú)法同時(shí)滿足,在同時(shí)使用mysql和redis的情況下,為了保證可用性和分區(qū)容錯(cuò)性(mysql和redis可能在不同機(jī)器)
所以我們常常會(huì)使用BASE來(lái)保證最終一致性。
那么如何實(shí)現(xiàn)呢
根據(jù)操作順序以及操作緩存的方式,刪除還是更新。將情況分成4種
1、先寫(xiě)緩存、再寫(xiě)數(shù)據(jù)庫(kù)
2、先寫(xiě)數(shù)據(jù)庫(kù)、再寫(xiě)緩存
3、先刪緩存,再寫(xiě)數(shù)據(jù)庫(kù)
4、先寫(xiě)數(shù)據(jù)庫(kù),再刪緩存
1、先寫(xiě)緩存、再寫(xiě)數(shù)據(jù)庫(kù)
寫(xiě)入緩存成功,但是寫(xiě)入數(shù)據(jù)庫(kù)失敗會(huì)導(dǎo)致數(shù)據(jù)庫(kù)存在臟數(shù)據(jù)
最終是要用數(shù)據(jù)庫(kù)做持久化的,所以這種方式問(wèn)題很大。
2、先寫(xiě)數(shù)據(jù)庫(kù)、再寫(xiě)緩存
為什么使用刪除緩存替代更新緩存
1、更新緩存可能失敗
2、并發(fā)場(chǎng)景下可能存舊數(shù)據(jù)
3、浪費(fèi)性能
一、1、A更新數(shù)據(jù)庫(kù)。2、A更新緩存。3、B更新數(shù)據(jù)庫(kù)。4、B更新緩存
二、1、A更新數(shù)據(jù)庫(kù)。2、B更新數(shù)據(jù)庫(kù)。3、A更新緩存。4、B更新緩存
三、1、A更新數(shù)據(jù)庫(kù)。2、B更新數(shù)據(jù)庫(kù)。3、B更新緩存。4、A更新緩存
一、二、更新緩存可能失敗
三 緩存存的是舊值是臟數(shù)據(jù)
寫(xiě)入的緩存需要復(fù)雜計(jì)算,更新頻率太高,浪費(fèi)性能
讀多寫(xiě)少的場(chǎng)景,數(shù)據(jù)沒(méi)被讀入就更新了。浪費(fèi)性能。寫(xiě)多場(chǎng)景不需要緩存
所以使用刪除緩存來(lái)替代更新緩存
3、先刪緩存,再寫(xiě)數(shù)據(jù)庫(kù)
1、A刪除緩存。2、B查詢緩存。3、B讀數(shù)據(jù)庫(kù)更新緩存。4、A寫(xiě)數(shù)據(jù)庫(kù)
也是會(huì)導(dǎo)致緩存存在臟數(shù)據(jù)
緩存延時(shí)雙刪
寫(xiě)請(qǐng)求-刪除緩存-更新數(shù)據(jù)庫(kù)-一段時(shí)間后,刪除緩存
最后的刪除緩存操作是為了確保讀請(qǐng)求結(jié)束后,寫(xiě)請(qǐng)求可以刪除
讀請(qǐng)求帶來(lái)的臟數(shù)據(jù)
為啥要延時(shí),刪除太快,可能導(dǎo)致在寫(xiě)入緩存前刪除了,那就沒(méi)意義了
4、先寫(xiě)數(shù)據(jù)庫(kù)、再刪緩存
緩存到期被刪除后,A查詢數(shù)據(jù)庫(kù),來(lái)不及更新緩存。B寫(xiě)數(shù)據(jù)庫(kù)并刪除
緩存。A此時(shí)才寫(xiě)入緩存。此時(shí)緩存的是舊數(shù)據(jù)
需要滿足緩存到期并且讀請(qǐng)求更新緩存時(shí)間比寫(xiě)請(qǐng)求刪除緩存還長(zhǎng)(比較罕見(jiàn))
處理刪除緩存失敗
1、重試機(jī)制 通過(guò)寫(xiě)入表用定時(shí)任務(wù)重試,重試超過(guò)一定次數(shù),人工介入
2、失敗后發(fā)送mq消息,mq消費(fèi)者實(shí)現(xiàn)重試,重試超過(guò)一定次數(shù),進(jìn)入死信隊(duì)列。
3、訂閱binlog加上mq重試機(jī)制
所以一般都使用延時(shí)雙刪的策略配合binlog訂閱加mq重試解決一致性問(wèn)題