一、快取穿透:(即:快取無資料,資料庫也無資料)
如黑客惡意攻擊,使用快取和資料庫均沒有的key進行不斷請求,導致資料庫壓力過大。
解決方法:
1、對使用者進行鑑權、對請求引數進行校驗,不合理直接過濾。
2、對查詢不到的資料也放到快取,value為空,設定一定的過期時間。(不太常用,因為如果是隨機key就不起作用,且佔快取)
3、使用布隆過濾器,快速判斷key是否在資料庫中存在,不存在直接返回。(最有效)
第1種是最常用的策略,第2種不太常用,因為如果是隨機key就不起作用,且佔快取,第三種最簡單有效。實際使用中,可以1、3相結合。
二、快取擊穿:(即:快取無資料,資料庫有資料,key比較集中)
如高併發的情況下,熱點資料快取過期,這時候會導致大量請求讀不到快取同時讀資料庫,導致資料庫負載過大。
解決方法:
1、設定熱點資料永遠不過期。
2、熱點資料快過期時,通過另乙個非同步執行緒重新設定key。
3、當從快取資料過期,重新從資料庫載入資料到快取的過程上互斥鎖。
第1種的話,資料量大時,快取量會比較大,第2種,很好理解,但是需要另外的邏輯去維護,會增加系統的複雜度。第3種,是比較常用的方式。
載入快取時上互斥鎖:
1public string get(string key) throws
exception else16}
17return
value;
18 }
三、快取雪崩:(即:快取無資料,資料庫有資料,key比較分散)
如在高併發的情況下,快取同一時刻失效(如快取掛了,或者設定了相同過期時間),所有請求會讀資料庫,容易導致資料庫負載瞬間上公升,乃至崩掉。如果重啟資料庫,立馬又會被新的請求壓崩。
解決方法:
1、快取的失效時間設定為隨機值,避免同時失效。
2、redis搭建高可用,主從+哨兵,redis cluster。
3、服務限流、降級,避免資料庫被瞬間壓崩。
第1種只能防止因快取同時過期導致的快取失效,第2種可以有效避免單台快取掛掉的情況。第3種是通過提高服務的高可用,來避免快取失效帶來的影響,是輔助措施。
快取擊穿和快取雪崩區別:
兩者有點像,主要區別在於快取擊穿是查詢同一條資料或熱點資料查詢不到,穿過了快取。快取雪崩是指大量資料查詢不到,穿過了快取。
快取擊穿 快取穿透 快取雪崩區別
快取穿透 產生原因 當前端傳送一條請求 這條請求快取和資料庫都沒有 到後台,會先到快取裡找,沒有再到資料庫去找,也沒有,如果有人惡意攻擊會造成資料庫蹦了,這就是穿透 解決方法 不管前面發的請求後台有沒有資料,都給乙個相應的值,比如乙個 空字串,在存到redies中,這樣下次再來查就不會再到資料庫中去...
快取穿透 快取擊穿 快取雪崩的區別
一 快取穿透 即 快取無資料,資料庫也無資料 如黑客惡意攻擊,使用快取和資料庫均沒有的key進行不斷請求,導致資料庫壓力過大。解決方法 1 對使用者進行鑑權 對請求引數進行校驗,不合理直接過濾。2 對查詢不到的資料也放到快取,value為空,設定一定的過期時間。不太常用,因為如果是隨機key就不起作...
快取穿透 快取擊穿 快取雪崩
一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...