資料庫 快取雪崩與快取穿透

2022-07-26 20:54:11 字數 815 閱讀 8588

首先,我們為什麼要使用redis呢?

那麼,如果快取掛了,就意味著我們全部的請求都跑去資料庫了。

redis不可能把所有的資料都快取起來(記憶體有限),所有redis需要對資料設定過期時間,並採用惰性刪除+定期刪除兩種策略對過期鍵進行刪除。如果快取資料設定的過期時間是相同的,並且恰好redis將這部分資料全部刪光了,這就導致這段時間內,這些快取同時失效,全部請求到資料庫中。

綜合,快取雪崩包含:

對於redis掛掉了,請求全部走資料庫的情況:

在事發前,實現redis的高可用(主從架構+sentinel),盡量避免redis掛掉。

在事發中,萬一redis真的掛了,我們可以設定本地快取(ehcache)+限流盡量避免資料庫被掛掉。

在事發後,redis持久化,重啟後自動從磁碟上載入資料,快速恢復快取資料。

對於某段時間內快取失效,請求全部走資料庫的情況:

在快取的時候給過期時間加乙個隨機數,可以大幅度減少該問題。

快取穿透指查詢乙個一定不存在的資料,由於快取不命中,並且出於容錯考慮,如果從資料庫查不到資料,則不寫入快取,這將導致這個不存在的資料每次請求時都要到資料庫去查詢,失去了快取的意義。(如黑客傳送請求不存在的資料,發生快取穿透,大量請求可能導致資料庫掛掉)。

由於請求的引數是不合法的(每次都請求不存在的引數),於是我們可以使用布隆過濾器或者壓縮filter提前攔截,不合法的就不讓這個請求到資料庫層。

此外,當我們從資料庫找不到的時候,我們也將這個空物件設定到快取裡邊去。下次請求的時候,就可以從快取裡邊獲取了。這種情況我們一般會將空物件設定乙個較短的時間。

快取穿透與快取雪崩

一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...

快取穿透與快取雪崩

引用原文 快取系統不得不考慮的另乙個問題是快取穿透與失效時的雪崩效應。快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有 很多種方法可以有效地解決快取穿透問題,...

快取穿透與快取雪崩

一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。1 對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料...