出現過程
假設有如下乙個系統,高峰期請求為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 帶來的...