天天看點

2023-06-25:redis中什麼是緩存穿透?該如何解決?

作者:福大大架構師每日一題

2023-06-25:redis中什麼是緩存穿透?該如何解決?

答案2023-06-25:

緩存穿透

緩存穿透指的是查詢一個根本不存在的資料,在這種情況下,無論是緩存層還是存儲層都無法命中。是以,每次請求都需要通路資料庫,這将導緻不存在的資料每次都需要查詢存儲層,這樣緩存就失去了保護後端存儲的作用。緩存穿透問題的解決對于維護系統性能和資源利用至關重要。

造成緩存穿透的基本原因有兩個。

緩存穿透的主要原因有兩個。

首先,可能是由于業務代碼或資料本身出現問題。例如,如果資料庫中的ID從1開始自增,而某些請求攜帶了不存在的ID值(比如負數或特别大的值),如果對參數不進行校驗,這些請求将會繞過緩存直接通路資料庫。由于資料庫中也查不到對應的資料,每個請求都會以相同的方式處理,這樣會給資料庫帶來很大壓力,尤其是在高并發的情況下,容易導緻系統崩潰。

其次,緩存穿透也可能由惡意攻擊、爬蟲等行為造成,這些請求大量命中緩存但資料卻不存在,導緻每個請求都需要通路存儲層。這種情況下,攻擊者可以通過大量的無意義請求消耗系統資源,進而影響系統的正常運作。

2023-06-25:redis中什麼是緩存穿透?該如何解決?

image.png

如何解決

1.緩存空對象

當存儲層不命中時,即使在資料庫中也沒有找到命中的資料,仍然将空對象儲存到緩存層中。這樣,下次對該資料的通路将從緩存中擷取,進而保護了後端資料源的通路。然而,需要注意的是如果頻繁存儲空值,會導緻緩存層占用更多的記憶體空間,尤其在面對攻擊時問題更為嚴重。是以,可以為這類資料設定較短的過期時間,以使其能夠自動被清理出緩存。

2.布隆過濾器攔截

在通路緩存層和存儲層之前,使用布隆過濾器提前儲存已存在的鍵,并進行第一層攔截。例如,對于一個推薦系統,存在4億個使用者ID,每個小時根據使用者的曆史行為計算并存儲推薦資料。然而,對于最新的使用者由于沒有曆史行為,可能發生緩存穿透。為此,可以将所有推薦資料的使用者ID建構成布隆過濾器。如果布隆過濾器認為某個使用者ID不存在,就不會進一步通路存儲層,進而在一定程度上保護了存儲層。

2023-06-25:redis中什麼是緩存穿透?該如何解決?

image.png

這些方法适用于資料命中率不高、資料相對穩定、實時性要求較低(通常是資料集較大)的應用場景。盡管實施這些方法可能會增加代碼的維護複雜性,但能有效減少緩存空間的占用。

2023-06-25:redis中什麼是緩存穿透?該如何解決?

福大大架構師每日一題java當死,golang當立。最新面試題,涉及golang,rust,mysql,redis,雲原生,算法,分布式,網絡,作業系統。582篇原創内容

公衆号

繼續閱讀