Redis緩存穿透,緩存雪崩以及緩存擊穿

緩存穿透

概念:
訪問一個不存在的key,緩存不起作用,請求會穿透到DB,流量大時DB會掛掉。

緩存穿透的概念很簡單,用戶想要查詢一個數據,發現redis內存數據庫沒有,也就是緩存沒有命中,於是向持久層數據庫查詢。發現也沒有,於是本次查詢失敗。當用戶很多的時候,緩存都沒有命中,於是都去請求了持久層數據庫。這會給持久層數據庫造成很大的壓力,這時候就相當於出現了緩存穿透。

這裏需要注意和緩存擊穿的區別,緩存擊穿,是指一個key非常熱點,在不停的扛着大併發,大併發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞。

解決方案:
1、布隆過濾器:採用布隆過濾器,使用一個足夠大的bitmap,用於存儲可能訪問的key,不存在的key直接被過濾;
2、緩存空對象:訪問key未在DB查詢到值,也將空值寫進緩存,但可以設置較短過期時間。之後再訪問這個數據將會從緩存中獲取,保護了後端數據源;

緩存雪崩

概念:

緩存雪崩是指,緩存層出現了錯誤,不能正常工作了。於是所有的請求都會達到存儲層,存儲層的調用量會暴增,造成存儲層也會掛掉的情況。如大量的key設置了相同的過期時間,導致在緩存在同一時刻全部失效,造成瞬時DB請求量大、壓力驟增,引起雪崩。

解決方案:

(1)redis高可用

這個思想的含義是,既然redis有可能掛掉,那我多增設幾臺redis,這樣一臺掛掉之後其他的還可以繼續工作,其實就是搭建的集羣。

(2)限流降級

這個解決方案的思想是,在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

(3)數據預熱

數據加熱的含義就是在正式部署之前,我先把可能的數據先預先訪問一遍,這樣部分可能大量訪問的數據就會加載到緩存中。在即將發生大併發訪問前手動觸發加載緩存不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。

緩存擊穿

概念:
一個存在的key,在緩存過期的一刻,同時有大量的請求,這些請求都會擊穿到DB,造成瞬時DB請求量大、壓力驟增。

解決方案:
在訪問key之前,採用SETNX(set if not exists)命令來設置另一個短期key來鎖住當前key的訪問,訪問結束再刪除該短期key。

業務層用分佈式鎖鎖住查詢數據庫的代碼,直到有一條線程查詢出來了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章