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

2021-08-21 16:27:03 字數 1378 閱讀 3288

快取擊穿、快取併發和快取雪崩是常見的由於併發量大而導致的快取問題。

快取擊穿通常是由惡意攻擊或者無意造成的;快取併發是由設計不足造成的;快取雪崩是由快取同時失效造成的,三種問題都比較典型,也是難以防範和解決的。

快取擊穿

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

解決辦法:

我們通常將空值快取起來,再次接收到同樣的查詢請求時,若命中快取並且值為空,就會直接返回,不會透傳到資料庫,避免快取擊穿。當然,有時惡意襲擊者可以猜到我們使用了這種方案,每次都會使用不同的引數來查詢,這就需要我們對輸入的引數進行過濾,例如,如果我們使用id進行查詢,則可以對id的格式進行分析,如果不符合產生id的規則,就直接拒絕,或者在id上放入時間資訊,根據時間資訊判斷id是否合法,或者是否是我們曾經生成的id,這樣可以攔截一定的無效請求。

快取併發

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

通常3種解決方式。

1.分布式鎖

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

2.本地鎖

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

3.軟過期

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

也可以通過非同步更新服務來更新設定軟過期的快取,這樣應用層就不用關心快取併發的問題了。

快取雪崩

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

解決辦法:

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

快取擊穿和快取雪崩

前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資...

快取穿透,快取雪崩和快取擊穿

q 快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。a 1.布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個...

快取擊穿 快取穿透和快取雪崩

快取擊穿 定義 快取中的key一般設有過期時間,如果某個key過期了,恰在這個時候,有大量的併發請求訪問這個key,則這些請求都會到達db,導致db瞬間壓力過大,壓垮db。解決方案 1.設定互斥鎖,mutex。當快取失效時不時立即去訪問資料庫,而是使用快取工具的操作成功帶返回值的操作,比如redis...