redis緩存一致性問(wèn)題
在實(shí)際業(yè)務(wù)中登馒,經(jīng)常會(huì)涉及到緩存低缩,那么保持緩存數(shù)據(jù)和數(shù)據(jù)庫(kù)數(shù)據(jù)之間的一致性同樣是一個(gè)非常重要的舉措
三種常見(jiàn)的緩存更新方案
方案一| 先更新數(shù)據(jù)庫(kù)而涉,再更新緩存
問(wèn)題:
高并發(fā)時(shí)荠藤,如果線程A更新完數(shù)據(jù)庫(kù)半抱,線程B再次更新數(shù)據(jù)庫(kù),線程B比線程A先一步更新緩存驯杜,那么緩存還是線程A的數(shù)據(jù)受啥,數(shù)據(jù)庫(kù)是線程B的數(shù)據(jù)
方案二 | 先刪除緩存,再更新數(shù)據(jù)庫(kù)
問(wèn)題:
線程A更新數(shù)據(jù),先刪除緩存滚局,此時(shí)居暖,線程B讀取數(shù)據(jù),因?yàn)榇藭r(shí)線程A還未上鎖藤肢,所以線程B可以從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)太闺,并且再次存入緩存中
改進(jìn)| 延時(shí)雙刪
即根據(jù)業(yè)務(wù)需要,在延遲多少時(shí)間后再把緩存刪除
問(wèn)題:
延遲刪除谤草,會(huì)影響接口吞吐量跟束,影響接口性能
第二次刪除可能存在問(wèn)題
方案三| 先更新數(shù)據(jù)庫(kù),再刪除緩存
問(wèn)題:
線程A讀取數(shù)據(jù)丑孩,恰好此時(shí)沒(méi)有緩存時(shí)冀宴,從數(shù)據(jù)庫(kù)讀到舊值,線程B更新新值到數(shù)據(jù)庫(kù)后刪除緩存温学,刪除緩存略贮,線程A更新緩存
概率較低,數(shù)據(jù)庫(kù)操作中極少出現(xiàn)查詢比更新慢的情況
基于消息的隊(duì)列| 異步更新緩存
基于訂閱binlog的同步機(jī)制
模仿mysql的主從復(fù)制交互協(xié)議仗岖,將自己偽裝成mysql slave 向mysql master 發(fā)送dump協(xié)議
mysql master收到dump請(qǐng)求逃延,推送bin log給的slave
解析bin log對(duì)象
利用消息隊(duì)列進(jìn)行分發(fā)消費(fèi)
最終一致性
給緩存添加過(guò)期時(shí)間可以保證緩存的最終一致性
作者:Whitestorm_wuha
鏈接:https://juejin.cn/post/7084155449896861727
來(lái)源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)轧拄,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處揽祥。