關(guān)于緩存和數(shù)據(jù)庫(kù)強(qiáng)一致的可行方案

前言

我們?cè)谌粘9ぷ髦薪?jīng)常會(huì)遇到要求緩存和數(shù)據(jù)庫(kù)強(qiáng)一致性的問(wèn)題,我們平常的做法是,確保數(shù)據(jù)庫(kù)插入成功,然后再更新緩存,但有時(shí)候數(shù)據(jù)庫(kù)插入成功后,緩存出現(xiàn)問(wèn)題或者緩存系統(tǒng)掛了,這時(shí)候請(qǐng)求會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù)最新的數(shù)據(jù),但是當(dāng)緩存恢復(fù)的時(shí)候,我們的并發(fā)請(qǐng)求又會(huì)訪問(wèn)到以前舊的緩存數(shù)據(jù),這時(shí)候就會(huì)出現(xiàn)不一致問(wèn)題。如果我們的業(yè)務(wù)系統(tǒng)對(duì)一致性要求不高,那么可以這么做,但是如果必須是強(qiáng)一致性,那么這個(gè)方案是有明顯漏洞的。

有的朋友可能會(huì)說(shuō),當(dāng)緩存恢復(fù)的時(shí)候直接清空緩存就可以了,然后重新加載一遍,這樣有二個(gè)問(wèn)題,第一個(gè)是我們的緩存數(shù)據(jù)有一部分其實(shí)是不經(jīng)常變動(dòng)的,全部清空再加載效率就非常低了。

方案一講解

  • 數(shù)據(jù)寫(xiě)入端
Paste_Image.png

注:同樣我們是同時(shí)寫(xiě)數(shù)據(jù)庫(kù)和緩存,但是在寫(xiě)緩存的時(shí)候會(huì)判斷寫(xiě)入是否成功,如果寫(xiě)入出錯(cuò),我們將key和更新?tīng)顟B(tài)值插入到數(shù)據(jù)庫(kù)狀態(tài)表中,同時(shí)關(guān)閉前端訪問(wèn)緩存的開(kāi)關(guān)。

  • 數(shù)據(jù)讀入端
Paste_Image.png

注:客戶端在讀數(shù)據(jù)的時(shí)候,要先判斷一下當(dāng)然開(kāi)關(guān)是否打開(kāi),如果打開(kāi)則讀取緩存,如果關(guān)閉則直接訪問(wèn)數(shù)據(jù)庫(kù)。關(guān)于判斷緩存開(kāi)關(guān)的問(wèn)題,可以不用每次讀庫(kù),而可以事先緩存到本地。

  • 緩存恢復(fù)端
Paste_Image.png

注:后臺(tái)有一個(gè)守護(hù)定時(shí)任務(wù),每隔一定時(shí)間來(lái)檢測(cè)緩存系統(tǒng)是否可用,如果可用則從狀態(tài)表中讀取key值和更新?tīng)顟B(tài)位,然后打開(kāi)緩存讀取開(kāi)關(guān),這樣前端數(shù)據(jù)讀取端則能夠從緩存讀取最新數(shù)據(jù)。

  • 總結(jié)

這方案的前提是當(dāng)前并發(fā)量并不是非常大的情況,試想如果當(dāng)前并發(fā)非常大,同時(shí)緩存又出了問(wèn)題,這時(shí)候整個(gè)請(qǐng)求就穿透到了數(shù)據(jù)庫(kù)層造成嚴(yán)重問(wèn)題。

那么我之前的初步想法是將這個(gè)流程封裝為中間件,根據(jù)不同庫(kù)配置不同的數(shù)據(jù)源,客戶端只需要直接請(qǐng)求中間件即可。但此方案不適合分庫(kù)分表的場(chǎng)景!在某種情況下是有局限性的!這個(gè)方案更多是為大家提供一種思路!

方案二講解

當(dāng)緩存不可用時(shí),在第一時(shí)間不對(duì)數(shù)據(jù)庫(kù)服務(wù)發(fā)起請(qǐng)求,在需要的時(shí)候異步填充緩存(優(yōu)先熱點(diǎn)緩存),然后我們將前端的請(qǐng)求直接返回失敗,也就是快速返回失敗,直到緩存恢復(fù)并且熱點(diǎn)緩存填充完畢。

Paste_Image.png

注:在某些情況下,這種方法意義不大,但當(dāng)系統(tǒng)的一部分發(fā)生故障時(shí)可以確保系統(tǒng)仍然可用的一種方式,讓請(qǐng)求快速失敗,確保不占用資源,也避免了級(jí)聯(lián)下游服務(wù)的故障。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容