快取雪崩,快取穿透,快取擊穿出現的原因及解決方案

2022-10-10 10:54:13 字數 1356 閱讀 3582

出現過程

假設有如下乙個系統,高峰期請求為5000次/秒,4000次走了快取,只有1000次落到了資料庫上,資料庫每秒1000的併發是乙個正常的指標,完全可以正常工作,但如果快取宕機了,或者快取設定了相同的過期時間,導致快取在同一時刻同時失效,每秒5000次的請求會全部落到資料庫上,資料庫立馬就死掉了,因為資料庫一秒最多抗2000個請求,如果dba重啟資料庫,立馬又會被新的請求打死了,這就是快取雪崩。

解決方法

事前:redis高可用,主從+哨兵,redis cluster,避免全盤崩潰

事中:本地ehcache快取 + hystrix限流&降級,避免mysql***

事後:redis持久化rdb+aof,快速恢復快取資料

快取的失效時間設定為隨機值,避免同時失效

出現過程

假如客戶端每秒傳送5000個請求,其中4000個為黑客的惡意攻擊,即在資料庫中也查不到。舉個例子,使用者id為正數,黑客構造的使用者id為負數,如果黑客每秒一直傳送這4000個請求,快取就不起作用,資料庫也很快***。

解決方法

對請求引數進行校驗,不合理直接返回

查詢不到的資料也放到快取,value為空,如 set -999

使用布隆過濾器,快速判斷key是否在資料庫中存在,不存在直接返回

第一種是最基本的策略,第二種其實並不常用,第三種比較常用。

為什麼第二種並不常用呢?

因為如果黑客構造的請求id是隨機數,第二種並不能起作用,反而由於快取的清空策略,(例如清除最近沒有被訪問的快取)導致有用的快取被清除了。

出現過程

設定了過期時間的key,承載著高併發,是一種熱點資料從這個key過期到重新從mysql載入資料放到快取的一段時間,大量的請求有可能把資料庫打死。快取雪崩是指大量快取失效快取擊穿是指熱點資料的快取失效

解決方法

設定key永遠不過期,或者快過期時,通過另乙個非同步執行緒重新設定key

當從快取拿到的資料為null,重新從資料庫載入資料的過程上鎖,下面寫個分布式鎖實現的demo

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

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

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

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

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

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