快取穿透 快取擊穿 快取雪崩問題

2021-09-27 04:07:50 字數 1602 閱讀 6261

​快取穿透

​ 快取穿透,是指查詢乙個資料庫一定不存在的資料正常的使用快取流程大致是,資料查詢先進行快取查詢,如果 key 不存在或者 key 已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取,就會每次都去查詢資料庫,而每次查詢都是空,每次又都不會進行快取。假如有惡意攻擊,就可以利用這個漏洞,對資料庫造成壓力,甚至壓垮資料庫,導致所有的請求都懟到資料庫上,從而資料庫連線異常。

解決方案:

利用互斥鎖,快取失效的時候,先去獲得鎖,得到鎖了再去請求資料庫。沒得到鎖,則休眠一段時間重試

採用非同步更新策略,無論 key 是否取到值,都直接返回。value 值中維護乙個快取失效時間,快取如果過期,非同步起乙個執行緒去讀資料庫,更新快取。需要做快取預熱(專案啟動前,先載入快取)操作。

提供乙個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的 key。迅速判斷出,請求所攜帶的 key 是否合法有效。如果不合法,則直接返回。

如果從資料庫查詢的物件為空,也放入快取,只是設定的快取過期時間較短,比如設定為 60 秒。

快取擊穿

​ 快取擊穿,是指乙個 key 非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個 key 在失效的瞬間,持續的大併發就穿破快取,直接請求資料庫,就像在乙個屏障上鑿開了乙個洞。做電商專案的時候,把這貨就稱為「爆款」。

解決方案:

從 redis 上看,確實沒有設定過期時間,這就保證了,不會出現熱點 key 過期問題,也就是「物理」不過期。

從功能上看,如果不過期,那不就成靜態的了嗎?所以我們把過期時間存在 key對應的 value 裡,如果發現要過期了,通過乙個後台的非同步執行緒進行快取的構建,也就是「邏輯」過期。

快取雪崩

​ 快取雪崩,是指快取同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到資料庫上,從而導致資料庫連線異常。

​ 產生雪崩的原因之一,比如**馬上就要到雙十一零點,很快就會迎來一波搶購,這波商品時間比較集中的放入了快取,假設快取乙個小時。那麼到了凌晨一點鐘的時候,這批商品的快取就都過期了。而對這批商品的訪問查詢,都落到了資料庫上,對於資料庫而言,就會產生週期性的壓力波峰。

​ 其實集中過期,倒不是非常致命,比較致命的快取雪崩,是快取伺服器某個節點宕機或斷網。因為自然形成的快取雪崩,一定是在某個時間段集中建立快取,那麼那個時候資料庫也是可以頂住壓力的,無非就是對資料庫產生週期性的壓力而已。而快取服務節點的宕機,對資料庫伺服器造成的壓力是不可預知的,很有可能瞬間就把資料庫壓垮。

解決方案:

​ 做電商專案的時候,一般是採取不同分類商品,快取不同週期。在同一分類中的商品,加上乙個隨機因子。這樣能盡可能分散快取過期時間,而且,熱門類目的商品快取時間長一些,冷門類目的商品快取時間短一些,也能節省快取服務的資源。

給快取的失效時間,加上乙個隨機值,避免集體失效。

使用互斥鎖,但是該方案吞吐量明顯下降了。

雙快取。我們有兩個快取,快取 a 和快取 b。快取 a 的失效時間為 20 分鐘,快取 b不設失效時間。自己做快取預熱操作。然後細分以下幾個小點

a. 從快取 a 讀資料庫,有則直接返回

b. a 沒有資料,直接從 b 讀資料,直接返回,並且非同步啟動乙個更新執行緒。

c. 更新執行緒同時更新快取 a 和快取 b。

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

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

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

所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。過程 快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作...

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

1 快取穿透 1.1 什麼是快取穿透 快取穿透,是指查詢乙個資料庫一定不存在的資料 核心 快取和資料庫該值不存在 正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。1.2 帶來的...