一. 快取雪崩
「雪崩來臨的時候沒有一片雪花是無辜的」。快取雪崩就是大範圍甚至於整個redis提供的快取服務不可用了,進而導致所有的請求都直接到了資料庫,甚至於擊垮整個服務鏈路。造成整個服務不可用。
出現原因:
- 給快取設定了過期時間,且大範圍的快取資料的過期時間一致。
- redis服務宕機。
解決方案:
- 提前預案: 給redis過期時間加隨機值預防大面積的快取同時過期失效。redis集群高可用可用,哨兵機制。
- 兜底方案: 服務熔斷,服務降級。監控到快取服務不可用時直接返回,或者限制流量直接請求到資料庫層。
二. 快取擊穿
相交於快取雪崩大範圍或整體快取不可用快取擊穿則是指某個熱點key過期,導致的快取失效。常常是一部分熱點資料,如秒殺產品的庫存資料。
出現原因:熱點資料過期,或者被其他手段刪除。
解決方案:
- 對於熱點資料快取時不設定過期時間。
- 第乙個請求發現熱點資料不在redis快取中,可以先阻塞其他請求,等到第乙個請求將資料庫資料讀出來並快取到redis後再喚醒其他請求從快取服務中讀取熱點資料。
三. 快取穿透
快取穿透則是另外乙個層面,指的時請求所訪問的資料既不在快取中,也不在資料庫中。如果應用持續有大量請求訪問資料,就會同時給快取和資料庫帶來巨大壓力。
出現原因:
- 業務層誤操作訪問到了不會存在的資料。
- 惡意請求攻擊
解決方案:
- 第乙個請求發現熱點資料不在redis快取中和資料庫中,可以先阻塞其他請求,快取乙個預設值返回。
- 利用redis提供的布隆過濾器。
- 前端有效值校驗。
四. 總結
快取雪崩,快取擊穿均屬於快取失效的一種異常快取雪崩影響範圍大於快取擊穿。快取穿透則是資料本身就不在在整個資料儲存層。
Redis 快取穿透 快取擊穿 快取雪崩
快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為小於0的資料或id為特別大等不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。舉例 通過分類id查詢廣告集合 param categoryid 廣告分類id return 廣告集合 public listf...
Redis快取穿透 快取擊穿 快取雪崩
4 總結 一般企業都會用到mysql等關係型資料庫,當訪問量不大的時候還可以支撐 當併發量高的時候,比如商品搶購或者主頁訪問瞬間較大的時候,請求直接到達db,可能會導致系統效能急劇下降以致癱瘓。db是面向磁碟的,磁碟io是比較重的操作,效能較低。為了克服上述的問題,通常需要在客戶端和db之間引入一層...
Redis快取穿透 快取擊穿 快取雪崩
指的是,redis快取中和資料庫中都沒有的資料,使用者不斷向伺服器發起請求,導致資料庫壓力過大。一般的流程查詢流程存在redis快取穿透bug 沒獲取到資料,到資料庫中查詢 如果一直沒獲取和查詢到資料,使用者不斷發起請求,資料庫就會不斷地進行查詢操作,導致資料庫壓力增大,導致快取擊穿。解決方案 阻止...