緩存與數(shù)據(jù)庫(kù)雙存儲(chǔ)钱雷,會(huì)涉及到雙寫骂铁,只要是雙寫就一定會(huì)有數(shù)據(jù)一致性的問(wèn)題,那么你如何解決一致性問(wèn)題罩抗?
1.讀的時(shí)候拉庵,先讀緩存,緩存沒(méi)有的話澄暮,就讀數(shù)據(jù)庫(kù)名段,然后取出數(shù)據(jù)后放入緩存,同時(shí)返回響應(yīng)泣懊。
可能的問(wèn)題:
大量請(qǐng)求同時(shí)過(guò)來(lái)伸辟,都穿過(guò)了緩存,去讀數(shù)據(jù)庫(kù)馍刮;
-----------------解決方案:加鎖信夫,如redis的互斥鎖,所有請(qǐng)求先去獲取鎖,如果獲取鎖成功静稻,首先判斷是否有緩存警没,如果沒(méi)有緩存才去數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)并放入緩存中并釋放鎖,如果有緩存則讀取緩存釋放鎖振湾;如果獲取鎖失敗杀迹,重新讀取緩存;重復(fù)以上過(guò)程幾次押搪。
2.更新的時(shí)候树酪,先更新數(shù)據(jù)庫(kù),然后再刪除緩存(不是修改緩存大州,而是刪除緩存续语,這個(gè)涉及到緩存到底會(huì)不會(huì)被頻繁訪問(wèn)到?這是一個(gè) lazy 計(jì)算的思想)厦画。
可能的問(wèn)題:
1.如果刪除緩存失敗了疮茄,則讀取的是舊數(shù)據(jù);
-----------------解決方案:先刪除緩存根暑,再修改數(shù)據(jù)庫(kù)力试。
2.修改數(shù)據(jù)庫(kù)還未完成的時(shí)候,一個(gè)請(qǐng)求過(guò)來(lái)排嫌,去讀緩存懂版,發(fā)現(xiàn)緩存空了,去查詢數(shù)據(jù)庫(kù)躏率,查到了修改前的舊數(shù)據(jù)躯畴,放到了緩存中。隨后數(shù)據(jù)變更的程序完成了數(shù)據(jù)庫(kù)的修改薇芝,這樣就產(chǎn)生了數(shù)據(jù)不一致問(wèn)題蓬抄。
--------------解決方案:將數(shù)據(jù)庫(kù)修改和查詢數(shù)據(jù)庫(kù)并更新緩存放入同一個(gè)隊(duì)列,這個(gè)隊(duì)列串行執(zhí)行夯到,這樣就有了先后順序嚷缭,這個(gè)方案增加了異步消費(fèi)和復(fù)雜度,同時(shí)需要考慮讀請(qǐng)求的可用性耍贾,在一定時(shí)間內(nèi)如果無(wú)法獲取則返回舊數(shù)據(jù)或者進(jìn)行降級(jí)阅爽。