簡(jiǎn)述:在互聯(lián)網(wǎng)項(xiàng)目開(kāi)發(fā)中,緩存的應(yīng)用是非常普遍了,緩存可以幫助頁(yè)面提高加載速度,減少服務(wù)器或數(shù)據(jù)源的負(fù)載。一、為什么需要緩存?一般在項(xiàng)目中,最消耗性能的地方就是后端服務(wù)的數(shù)據(jù)庫(kù)了。而數(shù)據(jù)庫(kù)的讀寫頻率常常都是不均勻分布的,大多情況是讀多寫少,并且讀
緩存在互聯(lián)網(wǎng)項(xiàng)目開(kāi)發(fā)中的應(yīng)用非常普遍,可以幫助頁(yè)面提高加載速度,減少服務(wù)器或數(shù)據(jù)源的負(fù)載。
為什么需要緩存?
一般來(lái)說(shuō),在項(xiàng)目中,最消耗性能的地方是后端服務(wù)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的讀寫頻率往往分布不均勻。在大多數(shù)情況下,讀寫少,讀操作(select)也會(huì)有一些復(fù)雜的判斷條件,比如like、group、join等等,這些語(yǔ)法很消耗性能,所以會(huì)有很多慢查詢,所以數(shù)據(jù)庫(kù)在閱讀操作中很容易遇到瓶頸。
然后,通過(guò)在數(shù)據(jù)庫(kù)前提供緩存服務(wù),可以有效地吸收不均勻的請(qǐng)求,抵抗流量峰值。
此外,如果應(yīng)用程序和數(shù)據(jù)源不在同一服務(wù)器中,中間會(huì)有大量的網(wǎng)絡(luò)消耗,這也會(huì)對(duì)應(yīng)用程序的響應(yīng)速度產(chǎn)生很大的影響。如果當(dāng)前應(yīng)用程序?qū)?shù)據(jù)實(shí)時(shí)性的要求不那么強(qiáng),則在應(yīng)用程序側(cè)添加緩存可以快速提高效率。
使用緩存會(huì)遇到哪些問(wèn)題?
雖然緩存可以提高整體性能,但也可能帶來(lái)其他問(wèn)題。
例如,使用緩存后,相當(dāng)于存儲(chǔ)兩個(gè)數(shù)據(jù),一個(gè)在數(shù)據(jù)庫(kù)中,另一個(gè)存儲(chǔ)在緩存中。當(dāng)需要寫入新數(shù)據(jù)或更新舊數(shù)據(jù)時(shí),如果我們只更新其中一個(gè)數(shù)據(jù)源,雙方的數(shù)據(jù)就不一致。因此,存在緩存數(shù)據(jù)和數(shù)據(jù)庫(kù)數(shù)據(jù)如何有效快速地同步以確保數(shù)據(jù)的最終一致性的問(wèn)題。
此外,緩存服務(wù)還引入了系統(tǒng)架構(gòu)的復(fù)雜性,因?yàn)榫彺姹旧韼?lái)的以下問(wèn)題需要額外關(guān)注:
1.緩存過(guò)期時(shí)間問(wèn)題
設(shè)計(jì)緩存的過(guò)期時(shí)間非常熟練,必須與業(yè)務(wù)的實(shí)際情況相結(jié)合。因?yàn)槿绻O(shè)計(jì)過(guò)期時(shí)間過(guò)短,緩存效果不好,數(shù)據(jù)從數(shù)據(jù)庫(kù)到緩存;如果緩存設(shè)計(jì)過(guò)期時(shí)間過(guò)長(zhǎng),會(huì)導(dǎo)致內(nèi)存浪費(fèi)。
2.緩存命中率問(wèn)題
這也是設(shè)計(jì)緩存中需要存儲(chǔ)的數(shù)據(jù)的一個(gè)重要點(diǎn)。如果設(shè)計(jì)不好,可能會(huì)導(dǎo)致緩存命中率過(guò)低,失去緩存效果。一般來(lái)說(shuō),對(duì)于熱點(diǎn)數(shù)據(jù),最好確保命中率超過(guò)70%。
3.緩存穿透/雪崩問(wèn)題
穿透/雪崩問(wèn)題是,如果緩存服務(wù)停機(jī)或完全丟失,所有流量可能會(huì)在一瞬間直接擊中后端數(shù)據(jù)庫(kù),可能導(dǎo)致連鎖反應(yīng)。瞬時(shí)請(qǐng)求高峰很可能導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法攜帶。
三、緩存更新策略有哪些?
一般有以下幾種典型的緩存模式:
CacheAside;
Read/WriteThrough;
WriteBehind。
每種模式都有不同的特點(diǎn),適用于不同的項(xiàng)目場(chǎng)景,下面依次看:
1、CacheAside模式
這是大家經(jīng)常用到的一種策略模式。這種模式主要流程如下:
在查詢數(shù)據(jù)時(shí),從緩存開(kāi)始Cache在中讀數(shù)據(jù)時(shí),如果沒(méi)有緩存,則從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)。獲得數(shù)據(jù)庫(kù)數(shù)據(jù)后,將數(shù)據(jù)放入緩存中Cache中;
如果應(yīng)用程序需要更新數(shù)據(jù),則需要更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)。更新完成后,通過(guò)指令緩存Cache數(shù)據(jù)失效。
寫完數(shù)據(jù)庫(kù)后,為什么不讓更新操作繼續(xù)緩存?Cache數(shù)據(jù)也被修改了?
主要是因?yàn)檫@樣做,有兩個(gè)寫作事件,擔(dān)心并發(fā)會(huì)導(dǎo)致臟數(shù)據(jù)。
同時(shí)有兩個(gè)請(qǐng)求(請(qǐng)求A和請(qǐng)求AB)并發(fā)執(zhí)行。請(qǐng)求A是讀取數(shù)據(jù),請(qǐng)求B是更新數(shù)據(jù)。在初始狀態(tài)緩存中沒(méi)有數(shù)據(jù)。當(dāng)請(qǐng)求A讀取數(shù)據(jù)并準(zhǔn)備重寫時(shí),此時(shí)此刻,請(qǐng)求B只是想更新數(shù)據(jù)。更新數(shù)據(jù)庫(kù)后,請(qǐng)求A將舊數(shù)據(jù)寫入緩存,屬于臟數(shù)據(jù)。
那么CacheAside模型沒(méi)有臟數(shù)據(jù)問(wèn)題嗎?不,在極端情況下也可能產(chǎn)生臟數(shù)據(jù),例如:
同時(shí)有兩個(gè)請(qǐng)求(請(qǐng)求A和請(qǐng)求AB)并發(fā)執(zhí)行。要求A讀數(shù)據(jù),要求B寫數(shù)據(jù)。如果在初始狀態(tài)緩存中沒(méi)有此數(shù)據(jù),請(qǐng)求A發(fā)現(xiàn)緩存中沒(méi)有數(shù)據(jù),并將在數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),讀取數(shù)據(jù)并準(zhǔn)備寫回緩存中。此時(shí),請(qǐng)求B編寫數(shù)據(jù),請(qǐng)求B在編寫數(shù)據(jù)庫(kù)數(shù)據(jù)后設(shè)置緩存故障。此時(shí),要求A在數(shù)據(jù)庫(kù)中讀取以前的舊數(shù)據(jù),并開(kāi)始將數(shù)據(jù)寫入緩存中,此時(shí)寫入舊數(shù)據(jù)。最終,緩存中的數(shù)據(jù)與數(shù)據(jù)庫(kù)中的數(shù)據(jù)不一致,導(dǎo)致臟數(shù)據(jù)。
但這種概率遠(yuǎn)小于上述概率。所以總的來(lái)說(shuō)。CacheAside模型仍然是一種簡(jiǎn)單實(shí)用的方式。
2、Read/WriteThrough模式
這種模式實(shí)際上是以緩存服務(wù)為主要存儲(chǔ),。應(yīng)用程序的所有讀寫請(qǐng)求都直接處理緩存服務(wù)。無(wú)論最終數(shù)據(jù)庫(kù)如何,數(shù)據(jù)庫(kù)的數(shù)據(jù)都由緩存服務(wù)維護(hù)和更新。然而,當(dāng)數(shù)據(jù)在緩存中發(fā)生變化時(shí),數(shù)據(jù)庫(kù)同步更新。在應(yīng)用程序眼中,只有緩存服務(wù)。
流程相當(dāng)簡(jiǎn)單:
直接訪問(wèn)緩存服務(wù)需要閱讀數(shù)據(jù)和更新數(shù)據(jù);
緩存服務(wù)同步將數(shù)據(jù)更新到數(shù)據(jù)庫(kù)。
該模種模式下,臟數(shù)據(jù)的概率相對(duì)較低,但它強(qiáng)烈依賴緩存,這對(duì)緩存服務(wù)的穩(wěn)定性有很大的要求。此外,在添加新的緩存節(jié)點(diǎn)時(shí),會(huì)出現(xiàn)初始狀態(tài)空數(shù)據(jù)問(wèn)題。
3、WriteBehind模式
這種模式是Read/WriteThrough模式的變體。區(qū)別在于Read/WriteThrough寫數(shù)據(jù)庫(kù)時(shí),模式的緩存是同步的,WriteBehind緩存操作數(shù)據(jù)庫(kù)的模式是異步的。
流程如下:
應(yīng)用要讀數(shù)據(jù)和更新數(shù)據(jù)都直接訪問(wèn)緩存服務(wù);
將緩存服務(wù)異步數(shù)據(jù)更新到數(shù)據(jù)庫(kù)(通過(guò)異步任務(wù))。
這種模式的特點(diǎn)是速度快,效率高,但數(shù)據(jù)一致性差,數(shù)據(jù)丟失,邏輯復(fù)雜。
以上是三種主流的緩存更新策略,以及Refrsh-Ahead由于使用不太常見(jiàn),不詳細(xì)介紹模式等。
緩存是提高互聯(lián)網(wǎng)項(xiàng)目效率的一個(gè)非常常見(jiàn)的解決方案。它有很多用途和關(guān)鍵。你可以一起交流。
騰佑科技十多年IDC運(yùn)營(yíng)經(jīng)驗(yàn),托管全球國(guó)內(nèi)外服務(wù)器租賃托管、機(jī)柜租賃、帶寬租賃、虛擬主機(jī)、云主機(jī)、CDN同時(shí)提供高防服務(wù)器安全服務(wù),歡迎客戶來(lái)電咨詢。
騰佑科技(www.158100.cn)成立于2009年,總部位于河南鄭州,是一家集互聯(lián)網(wǎng)基礎(chǔ)設(shè)施及軟硬件于一體化的高新技術(shù)企業(yè),具有IDC/ISP/ICP/云牌照、雙軟等資質(zhì),并擁有多個(gè)國(guó)家版權(quán)局認(rèn)證。公司自成立以來(lái),一直致力于發(fā)展互聯(lián)網(wǎng)IDC數(shù)據(jù)中心DataCenter、云計(jì)算Cloud、大數(shù)據(jù)BigDate、人工智能AI、內(nèi)容加速CDN、互聯(lián)網(wǎng)安全、軟件定制開(kāi)發(fā)等產(chǎn)品服務(wù)及行業(yè)客戶技術(shù)一體化智能解決方案;2018年成為百度智能云AI河南服務(wù)中心。
售前咨詢熱線:400-996-8756
備案提交:0371-89913068
售后客服:0371-89913000
搜索詞
熱門產(chǎn)品推薦