丨緩存異常下如何解決雪崩擊穿穿透難題_第1頁(yè)
丨緩存異常下如何解決雪崩擊穿穿透難題_第2頁(yè)
丨緩存異常下如何解決雪崩擊穿穿透難題_第3頁(yè)
丨緩存異常下如何解決雪崩擊穿穿透難題_第4頁(yè)
丨緩存異常下如何解決雪崩擊穿穿透難題_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Redis具體來(lái)說(shuō),當(dāng)數(shù)據(jù)保存在緩存中,并且設(shè)置了過(guò)期時(shí)間時(shí),如果在某一個(gè)時(shí)刻,大量數(shù)據(jù)同時(shí)過(guò)期,此時(shí),應(yīng)用再這些數(shù)據(jù)的話,就會(huì)發(fā)生緩存缺失。緊接著,應(yīng)用就會(huì)把請(qǐng)求發(fā)送給數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)中數(shù)據(jù)。如果應(yīng)用的并發(fā)請(qǐng)求量很大,那么數(shù)據(jù)庫(kù)的壓力也就很大,這會(huì)進(jìn)一步影響到數(shù)據(jù)庫(kù)的其他正常業(yè)務(wù)請(qǐng)求處理。我們來(lái)看一個(gè)簡(jiǎn)單的例子,如下圖所示:首先,我們可以避免給大量的數(shù)據(jù)設(shè)置相同的過(guò)期時(shí)間。如果業(yè)務(wù)層的確要求有些數(shù)據(jù)同時(shí)失效,你可以在用EXPRE命令給每個(gè)數(shù)據(jù)設(shè)置過(guò)期時(shí)間時(shí),給這些數(shù)據(jù)的過(guò)期時(shí)間增加一個(gè)較小的隨機(jī)數(shù)(例如,隨機(jī)增加1~3分鐘),這樣一來(lái),不同數(shù)據(jù)的過(guò)期時(shí)間有所差別,但差別又不會(huì)太大,既避免了大量數(shù)據(jù)同時(shí)過(guò)期,同時(shí)也保證了這些數(shù)據(jù)基本在相近的時(shí)間失效,仍然能滿足業(yè)務(wù)需求。當(dāng)業(yè)務(wù)應(yīng)用的是非數(shù)據(jù)(例如商品屬性)時(shí),暫時(shí)停止從緩存中查詢這些當(dāng)業(yè)務(wù)應(yīng)用的是數(shù)據(jù)(例如商品庫(kù)存)時(shí),仍然允許查詢緩存,如果緩存除了大量數(shù)據(jù)同時(shí)失效會(huì)導(dǎo)致緩存雪崩,還有一種情況也會(huì)發(fā)生緩存雪崩,那就是,eds緩存實(shí)例發(fā)生故障宕機(jī)了,無(wú)法處理請(qǐng)求,這就會(huì)導(dǎo)致大量請(qǐng)求一下子積壓到數(shù)據(jù)庫(kù)層,從而發(fā)生緩存雪崩。Redis。Redis所謂的服務(wù)熔斷,是指在發(fā)生緩存雪崩時(shí),為了防止連鎖的數(shù)據(jù)庫(kù)雪崩,甚至是整個(gè)系統(tǒng)的,我們暫停業(yè)務(wù)應(yīng)用對(duì)緩存系統(tǒng)的接口。再具體點(diǎn)說(shuō),就是業(yè)務(wù)應(yīng)用調(diào)用緩存接口時(shí),緩存客戶端并不把請(qǐng)求發(fā)給Reis緩存實(shí)例,而是直接返回,等到Reis緩存實(shí)例重新恢復(fù)服務(wù)后,再允許應(yīng)用請(qǐng)求發(fā)送到緩存系統(tǒng)。在業(yè)務(wù)系統(tǒng)運(yùn)行時(shí),我們可以監(jiān)測(cè)Reis緩存所在機(jī)器和數(shù)據(jù)庫(kù)所在機(jī)器的負(fù)載指標(biāo),例如每秒請(qǐng)求數(shù)、CPU利用率、內(nèi)存利用率等。如果我們發(fā)現(xiàn)Reis緩存實(shí)例宕機(jī)了,而數(shù)據(jù)庫(kù)所在機(jī)器的負(fù)載壓力突然增加(例如每秒請(qǐng)求數(shù)激增),此時(shí),就發(fā)生緩存雪崩了。大量請(qǐng)求被發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行處理。我們可以啟動(dòng)服務(wù)熔斷機(jī)制,暫停業(yè)務(wù)應(yīng)用對(duì)緩存服務(wù)的,從而降低對(duì)數(shù)據(jù)庫(kù)的壓力,如下圖所示:服務(wù)熔斷雖然可以保證數(shù)據(jù)庫(kù)的正常運(yùn)行,但是暫停了整個(gè)緩存系統(tǒng)的,對(duì)業(yè)務(wù)應(yīng)用的影響范圍大。為了盡可能減少這種影響,我們也可以進(jìn)行請(qǐng)求限流。這里說(shuō)的請(qǐng)求限流,就是指,我們?cè)跇I(yè)務(wù)系統(tǒng)的請(qǐng)求前端控制每秒進(jìn)入系統(tǒng)的請(qǐng)求數(shù),避免過(guò)多的請(qǐng)求被發(fā)送到數(shù)據(jù)庫(kù)。我給你舉個(gè)例子。假設(shè)業(yè)務(wù)系統(tǒng)正常運(yùn)行時(shí),請(qǐng)求前端允許每秒進(jìn)入系統(tǒng)的請(qǐng)求是1萬(wàn)個(gè),其中,9000個(gè)請(qǐng)求都能在緩存系統(tǒng)中進(jìn)行處理,只有1000個(gè)請(qǐng)求會(huì)被應(yīng)用發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行處理。一旦發(fā)生了緩存雪崩,數(shù)據(jù)庫(kù)的每秒請(qǐng)求數(shù)突然增加到每秒1萬(wàn)個(gè),此時(shí),我們就可以啟動(dòng)請(qǐng)求限流機(jī)制,在請(qǐng)求前端只允許每秒進(jìn)入系統(tǒng)的請(qǐng)求數(shù)為1000個(gè),再多的請(qǐng)求使用服務(wù)熔斷或是請(qǐng)求限流機(jī)制,來(lái)應(yīng)對(duì)Redis通過(guò)主從節(jié)點(diǎn)的方式構(gòu)建Reis緩存高可靠集群。如果Reis緩存的主節(jié)點(diǎn)故障宕機(jī)了,從節(jié)點(diǎn)還可以切換成為主節(jié)點(diǎn),繼續(xù)提供緩存服務(wù),避免了由于緩存實(shí)例宕機(jī)而導(dǎo)致的緩存雪崩問(wèn)題。緩存雪崩是發(fā)生在大量數(shù)據(jù)同時(shí)失效的場(chǎng)景下,而接下來(lái)我要向你介紹的緩存擊穿,是發(fā)生在某個(gè)熱點(diǎn)數(shù)據(jù)失效的場(chǎng)景下。和緩存雪崩相比,緩存擊穿失效的數(shù)據(jù)數(shù)量要小很多,應(yīng)對(duì)方法也不一樣,我們來(lái)看下。緩存擊穿是指,針對(duì)某個(gè)非常頻繁的熱點(diǎn)數(shù)據(jù)的請(qǐng)求,無(wú)法在緩存中進(jìn)行處理,緊接著,該數(shù)據(jù)的大量請(qǐng)求,一下子都發(fā)送到了后端數(shù)據(jù)庫(kù),導(dǎo)致了數(shù)據(jù)庫(kù)壓力激增,會(huì)影響數(shù)據(jù)庫(kù)處理其他請(qǐng)求。緩存擊穿的情況,經(jīng)常發(fā)生在熱點(diǎn)數(shù)據(jù)過(guò)期失效時(shí),如下圖所示:為了避免緩存擊穿給數(shù)據(jù)庫(kù)帶來(lái)的激增壓力,我們的解決方法也比較直接,對(duì)于特別頻繁的熱點(diǎn)數(shù)據(jù),我們就不設(shè)置過(guò)期時(shí)間了。這樣一來(lái),對(duì)熱點(diǎn)數(shù)據(jù)的請(qǐng)求,都可以在緩存中進(jìn)行處理,而Redis數(shù)萬(wàn)級(jí)別的高吞吐量可以很好地應(yīng)對(duì)大量的并發(fā)請(qǐng)求。好了,到這里,你了解了緩存雪崩和緩存擊穿問(wèn)題,以及它們的應(yīng)對(duì)方案。當(dāng)發(fā)生緩存雪崩或擊穿時(shí),數(shù)據(jù)庫(kù)中還是保存了應(yīng)用要的數(shù)據(jù)。接下來(lái),我向你介紹的緩存問(wèn)題,和雪崩、擊穿問(wèn)題不一樣,緩存發(fā)生時(shí),數(shù)據(jù)也不在數(shù)據(jù)庫(kù)中,這會(huì)同時(shí)給緩存和數(shù)據(jù)庫(kù)帶來(lái)壓力,那該怎么辦呢?我們來(lái)具體看下。緩存是指要的數(shù)據(jù)既不在Redis緩存中,也不在數(shù)據(jù)庫(kù)中,導(dǎo)致請(qǐng)求在緩存時(shí),發(fā)生緩存缺失,再去數(shù)據(jù)庫(kù)時(shí),發(fā)現(xiàn)數(shù)據(jù)庫(kù)中也沒(méi)有要的數(shù)據(jù)。此時(shí),應(yīng)用也無(wú)法從數(shù)據(jù)庫(kù)中數(shù)據(jù)再寫入緩存,來(lái)服務(wù)后續(xù)請(qǐng)求,這樣一來(lái),緩存也就成了“擺設(shè)”,如果應(yīng)用持續(xù)有大量請(qǐng)求數(shù)據(jù),就會(huì)同時(shí)給緩存和數(shù)據(jù)庫(kù)帶來(lái)巨大壓力,如下圖所示:業(yè)務(wù)層誤操作:緩存中的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)被誤刪除了,所以緩存和數(shù)據(jù)庫(kù)中都沒(méi)一旦發(fā)生緩存,我們就可以針對(duì)查詢的數(shù)據(jù),在Redis中緩存一個(gè)空值或是和業(yè)務(wù)層協(xié)商確定的缺省值(0)。緊接著,應(yīng)用發(fā)送的后續(xù)請(qǐng)求再進(jìn)行查詢時(shí),就可以直接從Redis中空值或缺省值,返回給業(yè)務(wù)應(yīng)用了,避免了把大量布隆過(guò)濾器由一個(gè)初值都為0的it數(shù)組和N個(gè)哈希函數(shù)組成,可以用來(lái)快速判斷某個(gè)數(shù)據(jù)是否存在。當(dāng)我們想標(biāo)記某個(gè)數(shù)據(jù)存在時(shí)(例如,數(shù)據(jù)已被寫入數(shù)據(jù)庫(kù)),布隆過(guò)濾器會(huì)通過(guò)三個(gè)操作完成標(biāo)記:首先,使用NNNbitbit1,這就完成了在布隆過(guò)濾器中標(biāo)記數(shù)據(jù)的操據(jù),那么,bit數(shù)組對(duì)應(yīng)bit位的值仍然為0。當(dāng)需要查詢某個(gè)數(shù)據(jù)時(shí),我們就執(zhí)行剛剛說(shuō)的計(jì)算過(guò)程,先得到這個(gè)數(shù)據(jù)在bit數(shù)組中對(duì)應(yīng)的N個(gè)位置。緊接著,我們查看bit數(shù)組中這N個(gè)位置上的bit值。只要這N個(gè)bit值有一個(gè)不為1,這就表明布隆過(guò)濾器沒(méi)有對(duì)該數(shù)據(jù)做過(guò)標(biāo)記,所以,查詢的數(shù)據(jù)一定沒(méi)有在數(shù)據(jù)庫(kù)中保存。為了便于你理解,我畫了一,你可以看下。圖中過(guò)濾器是一個(gè)包含10個(gè)bit位的數(shù)組,使用了3個(gè)哈希函數(shù),當(dāng)在過(guò)濾器中標(biāo)記數(shù)據(jù)X時(shí),X會(huì)被計(jì)算3次哈希值,并對(duì)10取模,取模結(jié)果分別是1、3、7。所以,bit1、3、71X1、3、7位是否為1,只要有一個(gè)為0,那么,X就肯定不在數(shù)據(jù)庫(kù)中。正是基于過(guò)濾器的快速檢測(cè)特性,我們可以在把數(shù)據(jù)寫入數(shù)據(jù)庫(kù)時(shí),使用過(guò)濾器做個(gè)標(biāo)記。當(dāng)緩存缺失后,應(yīng)用查詢數(shù)據(jù)庫(kù)時(shí),可以通過(guò)查詢過(guò)濾器快速判斷數(shù)據(jù)是否存在。如果不存在,就不用再去數(shù)據(jù)庫(kù)中查詢了。這樣一來(lái),即使發(fā)生緩存了,大量請(qǐng)求只會(huì)查詢Redis和過(guò)濾器,而不會(huì)積壓到數(shù)據(jù)庫(kù),也就不會(huì)影響數(shù)據(jù)庫(kù)的正常運(yùn)行。過(guò)濾器可以使用Redis實(shí)現(xiàn),本身就能承擔(dān)較大的并發(fā)壓力。最后案是,在請(qǐng)求的前端進(jìn)行請(qǐng)求檢測(cè)。緩存的一個(gè)原因是有大量的請(qǐng)求不存在的數(shù)據(jù),所以,一個(gè)有效的應(yīng)對(duì)方案是在請(qǐng)求前端,對(duì)業(yè)務(wù)系統(tǒng)接收到的請(qǐng)求進(jìn)行檢測(cè),把的請(qǐng)求(例如請(qǐng)求參數(shù)不合理、請(qǐng)求參數(shù)是值、請(qǐng)求字段不存在)直接過(guò)濾掉,不讓它們后端緩存和數(shù)據(jù)庫(kù)。這樣一來(lái),也就不會(huì)出現(xiàn)跟緩存雪崩、緩存擊穿這兩類問(wèn)題相比,緩存的影響更大一些,希望你能重點(diǎn)關(guān)注一下。從預(yù)防的角度來(lái)說(shuō),我們需要避免誤刪除數(shù)據(jù)庫(kù)和緩存中的數(shù)據(jù);從應(yīng)對(duì)角度來(lái)說(shuō),我們可以在業(yè)務(wù)系統(tǒng)中使用緩存空值或缺省值、使用過(guò)濾器,以及進(jìn)行請(qǐng)求檢測(cè)等方法。以在緩存中快速數(shù)據(jù)了,數(shù)據(jù)庫(kù)的壓力也會(huì)相應(yīng)地降低下來(lái),而緩存發(fā)生時(shí),Redis緩存和數(shù)據(jù)庫(kù)會(huì)同時(shí)持續(xù)承受請(qǐng)求壓力。最后,強(qiáng)調(diào)一下,服務(wù)熔斷、服務(wù)降級(jí)、請(qǐng)求限流這些方法都是屬于“有損”方案,在保證數(shù)據(jù)庫(kù)和整體系統(tǒng)穩(wěn)定的同時(shí),會(huì)對(duì)業(yè)務(wù)應(yīng)用帶來(lái)影響。例如使用服務(wù)降級(jí) 歸科技所有 不得售賣。頁(yè)面已增加防盜追蹤,將依法其上一 25|緩存異常(上):如何解決緩存和數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論