2023-06-25:redis中什么是緩存穿透?該如何解決?
2023-06-25:redis中什么是緩存穿透?該如何解決?
答案2023-06-25:
緩存穿透
緩存穿透指的是查詢一個(gè)根本不存在的數(shù)據(jù),在這種情況下,無論是緩存層還是存儲(chǔ)層都無法命中。因此,每次請(qǐng)求都需要訪問數(shù)據(jù)庫,這將導(dǎo)致不存在的數(shù)據(jù)每次都需要查詢存儲(chǔ)層,這樣緩存就失去了保護(hù)后端存儲(chǔ)的作用。緩存穿透問題的解決對(duì)于維護(hù)系統(tǒng)性能和資源利用至關(guān)重要。
造成緩存穿透的基本原因有兩個(gè)。
緩存穿透的主要原因有兩個(gè)。
首先,可能是由于業(yè)務(wù)代碼或數(shù)據(jù)本身出現(xiàn)問題。例如,如果數(shù)據(jù)庫中的ID從1開始自增,而某些請(qǐng)求攜帶了不存在的ID值(比如負(fù)數(shù)或特別大的值),如果對(duì)參數(shù)不進(jìn)行校驗(yàn),這些請(qǐng)求將會(huì)繞過緩存直接訪問數(shù)據(jù)庫。由于數(shù)據(jù)庫中也查不到對(duì)應(yīng)的數(shù)據(jù),每個(gè)請(qǐng)求都會(huì)以相同的方式處理,這樣會(huì)給數(shù)據(jù)庫帶來很大壓力,尤其是在高并發(fā)的情況下,容易導(dǎo)致系統(tǒng)崩潰。
其次,緩存穿透也可能由惡意攻擊、爬蟲等行為造成,這些請(qǐng)求大量命中緩存但數(shù)據(jù)卻不存在,導(dǎo)致每個(gè)請(qǐng)求都需要訪問存儲(chǔ)層。這種情況下,攻擊者可以通過大量的無意義請(qǐng)求消耗系統(tǒng)資源,從而影響系統(tǒng)的正常運(yùn)行。

如何解決
1.緩存空對(duì)象
當(dāng)存儲(chǔ)層不命中時(shí),即使在數(shù)據(jù)庫中也沒有找到命中的數(shù)據(jù),仍然將空對(duì)象保存到緩存層中。這樣,下次對(duì)該數(shù)據(jù)的訪問將從緩存中獲取,從而保護(hù)了后端數(shù)據(jù)源的訪問。然而,需要注意的是如果頻繁存儲(chǔ)空值,會(huì)導(dǎo)致緩存層占用更多的內(nèi)存空間,尤其在面對(duì)攻擊時(shí)問題更為嚴(yán)重。因此,可以為這類數(shù)據(jù)設(shè)置較短的過期時(shí)間,以使其能夠自動(dòng)被清理出緩存。
2.布隆過濾器攔截
在訪問緩存層和存儲(chǔ)層之前,使用布隆過濾器提前保存已存在的鍵,并進(jìn)行第一層攔截。例如,對(duì)于一個(gè)推薦系統(tǒng),存在4億個(gè)用戶ID,每個(gè)小時(shí)根據(jù)用戶的歷史行為計(jì)算并存儲(chǔ)推薦數(shù)據(jù)。然而,對(duì)于最新的用戶由于沒有歷史行為,可能發(fā)生緩存穿透。為此,可以將所有推薦數(shù)據(jù)的用戶ID構(gòu)建成布隆過濾器。如果布隆過濾器認(rèn)為某個(gè)用戶ID不存在,就不會(huì)進(jìn)一步訪問存儲(chǔ)層,從而在一定程度上保護(hù)了存儲(chǔ)層。

這些方法適用于數(shù)據(jù)命中率不高、數(shù)據(jù)相對(duì)穩(wěn)定、實(shí)時(shí)性要求較低(通常是數(shù)據(jù)集較大)的應(yīng)用場景。盡管實(shí)施這些方法可能會(huì)增加代碼的維護(hù)復(fù)雜性,但能有效減少緩存空間的占用。