快取雪崩
什么是快取雪崩
當某一個時刻出現大規模的快取失效的情況,那么就會導致大量的請求直接打在資料庫上面,導致資料庫壓力巨大,如果在高并發的情況下,可能瞬間就會導致資料庫宕機,這時候如果運維馬上又重啟資料庫,馬上又會有新的流量把資料庫打死,這就是快取雪崩,

分析:
造成快取雪崩的關鍵在于在同一時間大規模的key失效,為什么會出現這個問題呢,有幾種可能,第一種可能是Redis宕機,第二種可能是采用了相同的過期時間,搞清楚原因之后,那么有什么解決方案呢?
解決方案:
1、在原有的失效時間上加上一個隨機值,比如1-5分鐘隨機,這樣就避免了因為采用相同的過期時間導致的快取雪崩,
如果真的發生了快取雪崩,有沒有什么兜底的措施?
2、使用熔斷機制,當流量到達一定的閾值時,就直接回傳“系統擁擠”之類的提示,防止過多的請求打在資料庫上,至少能保證一部分用戶是可以正常使用,其他用戶多重繪幾次也能得到結果,
3、提高資料庫的容災能力,可以使用分庫分表,讀寫分離的策略,
4、為了防止Redis宕機導致快取雪崩的問題,可以搭建Redis集群,提高Redis的容災性,
快取擊穿
什么是快取擊穿?
其實跟快取雪崩有點類似,快取雪崩是大規模的key失效,而快取擊穿是一個熱點的Key,有大并發集中對其進行訪問,突然間這個Key失效了,導致大并發全部打在資料庫上,導致資料庫壓力劇增,這種現象就叫做快取擊穿,
分析:
關鍵在于某個熱點的key失效了,導致大并發集中打在資料庫上,所以要從兩個方面解決,第一是否可以考慮熱點key不設定過期時間,第二是否可以考慮降低打在資料庫上的請求數量,
解決方案:
1、上面說過了,如果業務允許的話,對于熱點的key可以設定永不過期的key,
2、使用互斥鎖,如果快取失效的情況,只有拿到鎖才可以查詢資料庫,降低了在同一時刻打在資料庫上的請求,防止資料庫打死,當然這樣會導致系統的性能變差,
快取穿透
什么是快取穿透?
我們使用Redis大部分情況都是通過Key查詢對應的值,假如發送的請求傳進來的key是不存在Redis中的,那么就查不到快取,查不到快取就會去資料庫查詢,假如有大量這樣的請求,這些請求像“穿透”了快取一樣直接打在資料庫上,這種現象就叫做快取穿透,
分析:
關鍵在于在Redis查不到key值,這和快取擊穿有根本的區別,區別在于快取穿透的情況是傳進來的key在Redis中是不存在的,假如有黑客傳進大量的不存在的key,那么大量的請求打在資料庫上是很致命的問題,所以在日常開發中要對引數做好校驗,一些非法的引數,不可能存在的key就直接回傳錯誤提示,要對呼叫方保持這種“不信任”的心態,
解決方案:

1、把無效的Key存進Redis中,如果Redis查不到資料,資料庫也查不到,我們把這個Key值保存進Redis,設定value=“null”,當下次再通過這個Key查詢時就不需要再查詢資料庫,這種處理方式肯定是有問題的,假如傳進來的這個不存在的Key值每次都是隨機的,那存進Redis也沒有意義,
2、使用布隆過濾器,布隆過濾器的作用是某個 key 不存在,那么就一定不存在,它說某個 key 存在,那么很大可能是存在(存在一定的誤判率),于是我們可以在快取之前再加一層布隆過濾器,在查詢的時候先去布隆過濾器查詢 key 是否存在,如果不存在就直接回傳,


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301032.html
標籤:java
