開發中為解決高併發訪問,通常會採用redis快取的方法,下面對使用redis快取時的快取穿透、快取雪崩、快取擊穿進行分析,是什麼,為什麼?
注意:快取不是萬能的,在使用方面有很多考慮的問題,把快取比喻成防彈衣,但是如果你沒有穿好這件防彈衣會適得其反。在高併發場景下有乙個常常被忽略的乙個地方,讀多還是寫多,讀多寫少用快取,寫多讀少用訊息佇列。
為什麼要用快取?為了系統的高效能,在每個系統的效能指標中有兩個重要的點,乙個是效能最佳點和效能最大值,超過最大融載值就走向系統崩潰的邊緣了。
快取穿透
快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,特別是不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。
解決方案:
1.在伺服器端,接收引數時業務介面中過濾不合法的值,null,負值,空值進行檢測。
2.bloom filter:類似於雜湊表的一種演算法,用所有可能的查詢條件生成乙個bitmap,在進行資料庫查詢之前會使用這個bitmap進行過濾,如果不在其中則直接過濾,從而減輕資料庫層面的壓力。
3.空值快取:一種比較簡單的解決辦法,在第一次查詢完不存在的資料後,將該key與對應的空值也放入快取中,只不過設定為較短的失效時間,例如幾分鐘,這樣則可以應對短時間的大量的該key攻擊,設定為較短的失效時間是因為該值可能業務無關,存在意義不大,且該次的查詢也未必是攻擊者發起,無過久儲存的必要,故可以早點失效。
快取雪崩
快取雪崩是指當快取服務掛掉或者熱點快取失效,所有請求都去查資料庫,導致資料庫連線不夠或者資料庫處理不過來,從而導致整個系統不可用。
解決方案:
加鎖排隊、 設定過期標誌更新快取 、二級快取(引入一致性問題)、 預熱、 快取與服務降級。
1.執行緒互斥:只讓乙個執行緒構建快取,其他執行緒等待構建快取的執行緒執行完,重新從快取獲取資料才可以,每個時刻只有乙個執行緒在執行請求,減輕了db的壓力,但缺點也很明顯,降低了系統的qps。
快取擊穿
快取擊穿實際上是快取雪崩的乙個特例,快取擊穿是指快取中沒有但資料庫中有資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。擊穿與雪崩的區別即在於擊穿是對於某一特定的熱點資料來說,而雪崩是全部資料。
解決方案:
1.快取設定不過期。
從redis上看,確實沒有設定過期時間,這就保證了,不會出現熱點key過期問題,也就是物理不過期。但是它會遇到乙個資料更新的問題,或者說資料不一致的問題。
在value中儲存過期時間,在編碼處理的時候,有條件(過期時間小於一分鐘)對快取資料進行更新,這個方案對效能最佳。
2.使用鎖工具(分布式鎖)
小結: 快取穿透 快取穿擊 快取雪崩 的理解
快取穿透 指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。解決方案 介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可...
快取穿透 快取雪崩
一 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。解決方案 1 介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 2 從快取取不到的資料,在...
快取穿透 快取擊穿 快取雪崩
一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...