緩存穿透,緩存雪崩,緩存擊穿以及解決辦法

(1)緩存穿透:指的是操作直接穿過了緩存層面,直接到達db層面,從而稱爲緩存穿透。直接查詢某一條不存在的數據,就會發生這種情況(其實還是要經過緩存層,只不過緩存層沒有這條數據,就會發起db層面的操作)。

解決方案:

1. Bloom filter算法(布隆過濾器???)

2. 空值緩存: 一種比較簡單的解決辦法,在第一次查詢完不存在的數據後,將該key與對應的空值也放入緩存中,只不過設定爲較短的失效時間,例如幾分鐘,這樣則可以應對短時間的大量的該key攻擊,設置爲較短的失效時間是因爲該值可能業務無關,存在意義不大,且該次的查詢也未必是攻擊者發起,無過久存儲的必要,故可以早點失效。

(2) 緩存雪崩:多個緩存數據設置的失效時間相同,在同一時間同時失效,大量系統請求從請求緩存變成請求數據庫,造成數據庫崩潰。

解決方案:

1. 交錯失效時間(即更改數據緩存的有效期,建議設置成固定時間的隨機時間,例如設置成3-5秒鐘中間的任意時間)。

2. redis高可用

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

3.限流降級

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

4. 數據預熱

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

(3) 緩存擊穿緩存擊穿實際上是緩存雪崩的一個特例,擊穿與雪崩的區別即在於擊穿是對於特定的熱點數據來說,而雪崩是全部數據。(典型例子:微博的熱點話題)。

解決方案:1. 二級緩存(參考鏈接)(阿里雙十一流量緩存擊穿解決辦法)LRU-K算法

參考:

https://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pc

https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc

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