高并發(fā)緩存策略大揭秘:面試必備的緩存更新模式解析
在高并發(fā)場(chǎng)景中,緩存能抵擋大量數(shù)據(jù)庫(kù)查詢,減少數(shù)據(jù)庫(kù)壓力,對(duì)于緩存更新通常有以下幾種模式可以選擇:
? cache aside
? read/write through
? write behind caching
cache aside模式
Cache-aside模式是一種常用的用于管理緩存的模式。它用于確保緩存與底層數(shù)據(jù)源之間的數(shù)據(jù)一致性。以下是cache-aside模式的工作原理:
圖片
1. 從緩存讀?。寒?dāng)有讀取操作請(qǐng)求時(shí),應(yīng)用程序首先檢查緩存中是否存在數(shù)據(jù)。如果在緩存中找到了數(shù)據(jù),則將其返回給調(diào)用者,避免了訪問(wèn)底層數(shù)據(jù)源的需要。
2. 緩存未命中:如果在緩存中未找到數(shù)據(jù),則表示緩存未命中。在這種情況下,應(yīng)用程序從底層數(shù)據(jù)源檢索數(shù)據(jù),并將檢索到的數(shù)據(jù)填充到緩存中。
3. 更新數(shù)據(jù):當(dāng)對(duì)數(shù)據(jù)執(zhí)行寫(xiě)入或更新操作時(shí),應(yīng)用程序首先更新底層數(shù)據(jù)源中的數(shù)據(jù)。然后,清除緩存中的數(shù)據(jù),以確保下一次讀取從數(shù)據(jù)源中檢索到更新后的數(shù)據(jù)。
通常寫(xiě)緩存和寫(xiě)數(shù)據(jù)庫(kù)是兩個(gè)獨(dú)立的事務(wù),選擇先更新緩存還是先更新數(shù)據(jù)庫(kù)都有可能產(chǎn)生數(shù)據(jù)不一致的情況。
先刪緩存,再更新數(shù)據(jù)庫(kù)的問(wèn)題
假設(shè)有兩個(gè)請(qǐng)求A、B。
? 請(qǐng)求A先刪除緩存,此時(shí)還未更新數(shù)據(jù)庫(kù)
? 請(qǐng)求B查詢緩存未命中,然后查詢數(shù)據(jù)庫(kù),查出舊數(shù)據(jù)寫(xiě)入緩存
? 請(qǐng)求A繼續(xù)將數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)
? 此時(shí)緩存與數(shù)據(jù)庫(kù)中的數(shù)據(jù)出現(xiàn)了不一致的情況
將緩存更新不做刪除的問(wèn)題
? 請(qǐng)求A先更新了數(shù)據(jù)庫(kù)
? 請(qǐng)求B更新了數(shù)據(jù)庫(kù),并更新了緩存
? 請(qǐng)求A最后更新緩存,此時(shí)請(qǐng)求A的數(shù)據(jù)是臟數(shù)據(jù)。
先更新DB再失效緩存問(wèn)題
先更新DB,再失效緩存也會(huì)出現(xiàn)問(wèn)題。
? 請(qǐng)求A讀取緩存未命中,查詢數(shù)據(jù)庫(kù)成功查到數(shù)據(jù)
? 請(qǐng)求B進(jìn)來(lái)更新數(shù)據(jù)庫(kù)成功,并刪除緩存數(shù)據(jù)
? 請(qǐng)求A將查詢的數(shù)據(jù)寫(xiě)入到緩存中,此時(shí)請(qǐng)求A寫(xiě)入緩存的數(shù)據(jù)已經(jīng)是臟數(shù)據(jù)
read/write through模式
cache aside模式需要應(yīng)用方維護(hù)緩存的讀寫(xiě),對(duì)數(shù)據(jù)和緩存的維護(hù)設(shè)計(jì)侵入代碼,代碼復(fù)雜性增加。read/write through模式彌補(bǔ)了這一問(wèn)題,調(diào)用方無(wú)需管理緩存和數(shù)據(jù)庫(kù)調(diào)用,通過(guò)抽象緩存管理組件維護(hù)緩存和數(shù)據(jù)庫(kù)的讀寫(xiě),解耦業(yè)務(wù)代碼。
read through模式
當(dāng)客戶端請(qǐng)求一個(gè)數(shù)據(jù)時(shí),如果緩存中不存在該項(xiàng)(緩存未命中),緩存系統(tǒng)會(huì)自動(dòng)從后端存儲(chǔ)中加載數(shù)據(jù),然后將其添加到緩存中,并返回給客戶端。對(duì)于后續(xù)的相同請(qǐng)求,數(shù)據(jù)則直接從緩存中獲取,直到緩存過(guò)期或被淘汰。
圖片
write through模式
在write-through模式中,當(dāng)客戶端更新一個(gè)數(shù)據(jù)項(xiàng)時(shí),緩存系統(tǒng)會(huì)同時(shí)更新緩存和后端存儲(chǔ)。這意味著所有的寫(xiě)操作都會(huì)同步地寫(xiě)入緩存和存儲(chǔ),確保二者的數(shù)據(jù)一致性。
圖片
write behind caching模式
Write Behind模式和Write Through模式整個(gè)架構(gòu)是一樣的,核心在于write through在緩存數(shù)據(jù)庫(kù)中的更新是同步的,而Write Behind是異步的。
每次的請(qǐng)求寫(xiě)都是直接更新緩存然后就成功返回,并沒(méi)有同步把數(shù)據(jù)更新到數(shù)據(jù)庫(kù)。而把更新到數(shù)據(jù)庫(kù)的過(guò)程稱為flush,觸發(fā)flush的條件可自定義,如定時(shí)或達(dá)到一定容量閾值時(shí)進(jìn)行flush操作。并且可以實(shí)現(xiàn)批量寫(xiě),合并寫(xiě)等策略,也有效減少了更新數(shù)據(jù)的頻率,這種模式最大的好處就是讀寫(xiě)響應(yīng)非???,吞吐量也會(huì)明顯提升。這種模式也有其他的問(wèn)題,比如數(shù)據(jù)不是強(qiáng)一致性的,因?yàn)榘炎钚碌臄?shù)據(jù)放在緩存里,如果緩存在flush到數(shù)據(jù)庫(kù)之前宕機(jī)了就會(huì)丟失數(shù)據(jù),另外實(shí)現(xiàn)也比較復(fù)雜。
幾種模式對(duì)
模式 | 優(yōu)點(diǎn) | 缺點(diǎn) |
Cache Aside | 實(shí)現(xiàn)比較簡(jiǎn)單 | 需要應(yīng)用程序負(fù)責(zé)緩存的讀取和寫(xiě)入操作,代碼侵入較大 |
Read/Write Through | 引入緩存管理組件,緩存和數(shù)據(jù)庫(kù)的維護(hù)對(duì)應(yīng)用程序透明;應(yīng)用代碼入侵小,邏輯更清晰 | 引入緩存管理組件,實(shí)現(xiàn)更復(fù)雜 |
Write Behind Caching | 讀寫(xiě)直接和緩存交互,異步批量更新數(shù)據(jù) |