一、快取雪崩:
1、什么是快取雪崩:
如果緩在某一個時刻出現大規模的key失效,那么就會導致大量的請求打在了資料庫上面,導致資料庫壓力巨大,如果在高并發的情況下,可能瞬間就會導致資料庫宕機,這時候如果運維馬上又重啟資料庫,馬上又會有新的流量把資料庫打死,這就是快取雪崩,
2、問題分析:
造成快取雪崩的關鍵在于同一時間的大規模的key失效,為什么會出現這個問題,主要有兩種可能:第一種是Redis宕機,第二種可能就是采用了相同的過期時間,搞清楚原因之后,那么有什么解決方案呢?
3、解決方案:
(1)事前:
① 在原有key的失效時間的基礎上,加上一個隨機值,比如1-5分鐘,這樣就可以避免相同的過期時間導致快取雪崩,造成大量資料庫的訪問,
② 分級快取,第一級快取失效的基礎上,訪問二級快取,每一級快取的失效時間都不同,
③ 保證Redis快取的高可用,防止Redis宕機導致快取雪崩的問題,可以使用 主從+ 哨兵,Redis集群來避免 Redis 全盤崩潰的情況,
(2)事中:
① 使用熔斷機制,限流降級,當流量達到一定的閾值,直接回傳“系統擁擠”之類的提示,防止過多的請求打在資料庫上將資料庫擊垮,至少能保證一部分用戶是可以正常使用,其他用戶多重繪幾次也能得到結果,
(3)事后:
① 開啟Redis持久化機制,盡快恢復快取資料,一旦重啟,就能從磁盤上自動加載資料恢復記憶體中的資料,
二、快取擊穿:
1、什么是快取擊穿:
快取擊穿跟快取雪崩有點類似,快取雪崩是大規模的key失效,而快取擊穿是某個熱點的key失效,大并發集中對其進行請求,就會造成大量請求讀快取沒讀到資料,從而導致高并發訪問資料庫,引起資料庫壓力劇增,這種現象就叫做快取擊穿,
2、問題分析:
關鍵在于某個熱點的key失效了,導致大并發集中打在資料庫上,所以要從兩個方面解決,第一是否可以考慮熱點key不設定過期時間,第二是否可以考慮降低打在資料庫上的請求數量,
3、解決方案:
(1)熱點資料快取永遠不過期,
(2)在快取失效后,通過互斥鎖或者佇列來控制讀資料寫快取的執行緒數量,比如某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待,這種方式會阻塞其他的執行緒,此時系統的吞吐量會下
三、快取穿透:
1、什么是快取穿透:
大部分情況下,我們使用Redis都是通過Key查詢對應的值,假如發送的請求傳進來的key是不存在Redis中的,那么就查不到快取,查不到快取就會去資料庫查詢,
假設大量的并發,或者有人惡意頻繁用一定不存在的key來訪問服務器,那么每次請求都一定會打到資料庫上面去,這些請求像“穿透”了快取一樣直接打在資料庫上,這種現象就叫做快取穿透,嚴重情況下,可能導致資料庫承受不住而宕機崩潰,
2、問題分析:
快取穿透的關鍵在于在Redis中查不到key值,它和快取擊穿的根本區別在于傳進來的key在Redis中是不存在的,假如有黑客傳進大量的不存在的key,那么大量的請求打在資料庫上是很致命的問題,所以在日常開發中要對引數做好校驗,一些非法的引數,不可能存在的key就直接回傳錯誤提示,

3、解決方法:
(1)將無效的key存放進Redis中:
當出現Redis查不到資料,資料庫也查不到資料的情況,我們就把這個key保存到Redis中,設定value="null",并設定其過期時間極短,后面再出現查詢這個key的請求的時候,直接回傳null,就不需要再查詢資料庫了,但這種處理方式是有問題的,假如傳進來的這個不存在的Key值每次都是隨機的,那存進Redis也沒有意義,
(2)使用布隆過濾器:
如果布隆過濾器判定某個 key 不存在布隆過濾器中,那么就一定不存在,如果判定某個 key 存在,那么很大可能是存在(存在一定的誤判率),于是我們可以在快取之前再加一個布隆過濾器,將資料庫中的所有key都存盤在布隆過濾器中,在查詢Redis前先去布隆過濾器查詢 key 是否存在,如果不存在就直接回傳,不讓其訪問資料庫,從而避免了對底層存盤系統的查詢壓力,

如何選擇:針對一些惡意攻擊,攻擊帶過來的大量key是隨機,那么我們采用第一種方案就會快取大量不存在key的資料,那么這種方案就不合適了,我們可以先對使用布隆過濾器方案進行過濾掉這些key,所以,針對這種key例外多、請求重復率比較低的資料,優先使用第二種方案直接過濾掉,而對于空資料的key有限的,重復率比較高的,則可優先采用第一種方式進行快取,
四、快取預熱:
1、什么是快取預熱:
快取預熱是指系統上線后,提前將相關的快取資料加載到快取系統,避免在用戶請求的時候,先查詢資料庫,然后再將資料快取的問題,用戶直接查詢事先被預熱的快取資料,
2、快取預熱解決方案:
(1)直接寫個快取重繪頁面,上線時手工操作下
(2)資料量不大時,可以在專案啟動的時候自動進行加載
(3)定時重繪快取
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255645.html
標籤:其他
