快取穿透 快取併發和快取雪崩筆記

2021-10-07 18:29:34 字數 1608 閱讀 7062

快取穿透、快取併發和快取雪崩是常見的由於併發量大而導致的快取問題。這裡記錄下其產生原因和解決方案。

快取穿透是由惡意攻擊或無意造成的;快取併發是由設計不足造成的;快取雪崩是由快取同時失效造成的。

概念:

快取穿透指的是使用不存在的 key 進行大量的高併發查詢,這導致快取無法命中,每次請求都要穿透到後端資料庫系統進行查詢,使資料庫壓力過大,甚至使資料庫服務被壓死。

解決方案:

1、我們通常將空值快取起來,再次接收到同樣的查詢請求時,若命中快取並且值為空,就會直接返回,不會穿透的資料庫,避免快取穿透。

2、當然,有時惡意襲擊者可以猜到我們使用了這種方案,每次都會使用不同的引數來查詢,這就需要我們對輸入的引數進行過濾,例如,如果我們使用 id 進行查詢,則可以對 id 的格式進行分析,如果不符合產生 id 的規則,就直接拒絕,或者在 id 上放入時間資訊,根據時間資訊判斷 id 是否合法 ,或者是否是我們曾經生成的 id,這樣可以攔截一定的無效請求。

概念:

快取併發的問題通常發生在高併發的場景下,當乙個快取 key 過期時,因為訪問這個快取 key 的請求量較大,多個請求同時發現快取過期,因此多個請求會同時訪問資料庫來查詢最新的資料,並且回寫快取,這樣會造成應用和資料庫的負載增加,效能降低,由於併發較高,甚至會導致資料庫被壓死。

解決方案:

1、分布式鎖

使用分布式鎖,保證對於每個 key 同時只有乙個執行緒去查詢後端服務,其他執行緒沒有獲得分布式鎖的許可權,因此只需要等待即可。這種方式將高併發的壓力轉移到了分布式鎖,因此對分布式鎖的考驗很大。

2、本地鎖

與分布式鎖類似,我們通過本地鎖的方式來限制只有乙個執行緒去資料庫查詢資料,而其他執行緒只需等待,等前面的執行緒查詢到資料後再訪問快取。但是,這種方法只能限制乙個服務節點只有乙個執行緒去資料庫中查詢,如果乙個服務有多個節點,則還會有多個資料庫查詢操作,也就是說在節點數量較多的情況下並沒有完全解決快取併發的問題。

3、軟過期

軟過期是指對快取中的資料設定失效時間,就是不使用快取伺服器提供的過期時間,而是業務層在資料中儲存過期時間資訊,由業務程式判斷是否過期並更新,在發現了資料即將過期時,將快取的時效延長,程式可以派遣乙個執行緒去資料庫中獲取最新的資料,其他執行緒這時看到延長了的過期時間,就會繼續使用舊資料,等派遣的執行緒獲取最新資料後再更新快取。也可以通過非同步更新服務來更新設定軟過期的快取,這樣應用層就不用關心快取併發的問題了。

概念:

快取雪崩指快取伺服器重啟或者大量快取集中在某乙個時間段內失效,給後端資料庫造成瞬間的負載公升高的壓力,甚至壓垮資料庫的情況。

解決方案:

通常的解決辦法是對不同的資料使用不同的失效時間,甚至對相同的資料、不同的請求使用不同的失效時間。例如,我們要快取 user 資料,會對每個使用者的資料設定不同的快取過期時間,可以定義乙個基礎時間,假設 10 秒,然後加上乙個兩秒以內的隨機數,過期時間為 10 ~ 12 秒,就會避免快取雪崩。

快取穿透 快取併發和快取雪崩

快取穿透 快取併發和快取雪崩是常見的由於併發量大而導致的快取問題。快取穿透通常是由惡意攻擊或者無意造成的 快取併發是由於設計不足 快取雪崩是快取同時失效造成的。快取穿透 快取穿透是使用了不存在的key進行大量的高併發查詢,導致快取無法命中,每次快取穿透後都要去資料庫中進行查詢,導致資料庫壓力過大甚至...

快取雪崩和快取穿透

快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分...

快取穿透和快取雪崩

一 快取穿透 查詢乙個 必然不存在的資料,首先通過key到快取去查詢,不存在,然後到達db,這樣會對後台的db造成很大的壓力,這樣每次都會請求到達資料庫,這就是快取穿透 快取失效 如果快取集中在一段時間內失效,db的壓力凸顯 快取穿透避免的方法 1 最簡單粗暴的方法 如果在資料庫中查詢的也為null...