緩存穿透、緩存擊穿、緩存雪崩

緩存穿透

? ? ? ? 緩存穿透是指緩存服務(wù)器和數(shù)據(jù)庫(kù)中都沒(méi)有符合條件的數(shù)據(jù),例如查找id<0的用戶,由于該類用戶不存在所以緩存中沒(méi)有對(duì)應(yīng)數(shù)據(jù),每次請(qǐng)求進(jìn)來(lái)都會(huì)從數(shù)據(jù)庫(kù)中進(jìn)行一次查詢;這類請(qǐng)求可能是潛在的攻擊者發(fā)起的,當(dāng)請(qǐng)求量很大時(shí)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大。

解決方案:

一、緩存服務(wù)器中允許存空值:例如當(dāng)首次查詢id=-2的用戶時(shí),在緩存服務(wù)器中將null作為value存入,此后查詢?cè)撚脩魰r(shí)直接將緩存服務(wù)器中的null返回;應(yīng)當(dāng)注意的是,為了查詢結(jié)果的正確性,在必要時(shí)要對(duì)null值進(jìn)行更新,例如,假設(shè)此前查詢id=999的用戶并不存在,緩存服務(wù)器中保存了999:null的一條記錄,但是隨著用戶的新增,如果此后創(chuàng)建了id=999的用戶,就需要對(duì)緩存服務(wù)器中的這條記錄進(jìn)行更新。

二、BloomFilter:大部分情況下,緩存穿透是很多惡意請(qǐng)求引起的,這些請(qǐng)求可能隨機(jī)生成查詢條件進(jìn)行查詢,這些查詢條件對(duì)應(yīng)的數(shù)據(jù)在緩存服務(wù)器和數(shù)據(jù)庫(kù)中都沒(méi)有,就容易引起緩存穿透;因此,我們可以將查詢的數(shù)據(jù)條件哈希到一個(gè)足夠大的布隆過(guò)濾器中,請(qǐng)求會(huì)首先被布隆過(guò)濾器攔截,一定不存在的數(shù)據(jù)就直接攔截返回了,從而降低對(duì)數(shù)據(jù)庫(kù)的壓力。

緩存擊穿

? ? ? ? 緩存擊穿是緩存服務(wù)器中沒(méi)有但是數(shù)據(jù)庫(kù)中有的數(shù)據(jù)(例如當(dāng)該條緩存過(guò)期時(shí)),如果大并發(fā)量請(qǐng)求進(jìn)來(lái),在緩存服務(wù)器中沒(méi)有此條數(shù)據(jù),這些請(qǐng)求同時(shí)去數(shù)據(jù)庫(kù)中進(jìn)行查找,造成數(shù)據(jù)庫(kù)瞬間壓力增大。

解決方案:

一、異步更新:通過(guò)定時(shí)任務(wù)在緩存服務(wù)器中的數(shù)據(jù)未過(guò)期時(shí)對(duì)其進(jìn)行更新。

二、互斥鎖:當(dāng)Redis中根據(jù)key獲得的value值為空時(shí),先鎖上,然后從數(shù)據(jù)庫(kù)加載,加載完畢,釋放鎖。若其他線程也在請(qǐng)求該key時(shí),發(fā)現(xiàn)獲取鎖失敗,則先阻塞;采用互斥鎖實(shí)際上就是將并行變成串行,會(huì)降低系統(tǒng)吞吐量。

緩存雪崩

? ??????緩存雪崩是指緩存中大量緩存同時(shí)過(guò)期,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫(kù)壓力過(guò)大甚至宕機(jī)。和緩存擊穿不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過(guò)期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫(kù)。

解決方案:

一、為緩存數(shù)據(jù)設(shè)置不同的過(guò)期時(shí)間。

二、緩存服務(wù)器集群部署:采用集群部署,避免緩存服務(wù)器單點(diǎn)故障。

最后編輯于
?著作權(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)容