首先,我們為什麼要使用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對應的資料...