把快取穿透 快取擊穿和快取雪崩擼明白

2021-08-29 04:08:39 字數 1794 閱讀 9536

在專案中,快取的使用是必不可少的,快取給我們系統帶來極速的響應。但是我們在享受快取帶來快速的同時,也需要考慮我們的快取使用是不是有風險。比如說快取使用中常見的三個問題"快取穿透","快取擊穿","快取雪崩",下面來和大家一起學習下這三個小知識點。

快取穿透指的是使用不存在的key進行大量的高併發查詢,這導致快取無法命中,每次請求都要穿透到後端資料庫系統進行查詢,使資料庫壓力過大,甚至使資料庫服務被壓死。比如說資料庫 id 是從 1 開始的,結果黑客發過來的請求 id 全部都是負數。這樣的話,快取中不會有,請求每次都直接查詢資料庫。這種惡意攻擊場景的快取穿透就會直接把資料庫給打死。

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

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

分布式鎖

使用分布式鎖,保證對於每個key同時只有乙個執行緒去請求,其他執行緒沒有獲得分布式鎖,因此只能等待。這種方式將資料庫高併發壓力轉移到了分布式鎖,因此對分布式鎖的考驗很大,而且也會影響系統的吞吐量。若快取的資料是基本不會發生更新的,則可嘗試將該熱點資料設定為永不過期。

軟過期

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

快取雪崩指快取伺服器重啟或者大量快取集中在某乙個時間段內失效,給後端資料庫造成瞬時的負載公升高的壓力,甚至壓垮資料庫的情況。比如說系統 a,高峰期每秒 5000 個請求,本來快取在高峰期可以扛住每秒 4000 個請求,但是快取機器意外發生了全盤宕機。快取掛了,此時 1 秒 5000 個請求全部落資料庫,資料庫必然扛不住。如下圖所示

快取雪崩的事前事中事後的解決方案如下:

使用者傳送乙個請求,系統收到請求後,先查本地 ehcache 快取,如果沒查到再查 redis。如果 ehcache 和 redis 都沒有,再查資料庫,將資料庫中的結果,寫入 ehcache 和 redis 中。上圖中的限流元件,可以設定每秒的請求,有多少能通過元件,剩餘的未通過的請求,怎麼辦?走降級!可以返回一些預設的值,友情提示,或者空白的值。這種降級和資料庫崩掉相比,我們肯定選擇前者。

快取穿透通常是由惡意攻擊或者無意造成的;快取併發可能是由設計不足造成的;快取雪崩是由快取同時失效造成的,我們在設計快取之初就需要考慮到這個問題。否則真的出事了,就是臨渴掘井了。

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

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

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

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

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

快取系統是我們平時開發經常使用到的,也是在高併發場景下減少或防止流量對db等底層系統衝擊的最有效手段之一。下面就簡單談談快取系統經常提及的三個問題以及解決方案。首先回憶下通常情況我們設定的快取機制,如下圖所示 快取載入機制 這套機制,由於出於容錯考慮,從儲存層查不到資料則不寫入快取,這就導致每次請求...