1、快取穿透
面試中比較頻繁問之一,首先得知道它的概念:用戶想要訪問一個資料,發現Redis記憶體資料沒有(也就是快取沒有命中),于是向持久層資料庫訪問,發現資料庫中也沒有,這次訪問就算是失敗,
這時如果很多用戶訪問,快取中沒有命中,都直接請求資料庫,就造成資料庫壓力很大,這時就出現快取穿透,快取沒有起到作用,很多訪問直接訪問資料庫,

出現的原因
- Redis(快取)查詢不到資料
- 出現很多非正常的url訪問
解決方案
(1)對空值快取
如果一個查詢回傳的資料為空,(查詢為空的資料,在Redis也查不到)仍然把這個空結果(null)進行快取,設定空結果的過期時間(最好設定為五分鐘),之后再次訪問這個資料將會從快取中獲取,保護了后端資料源,

(2)采用布隆過濾器
布隆過濾器是一種資料結構,對所有可能查詢的引數以hash形式存盤,控制層先進行校驗,可以檢索一個元素是否在一個集合中;不符合則就丟棄,從而避免對底層存盤系統的查詢壓力,

2、快取擊穿
這個快取穿透有區別的,快取擊穿:是指一個key非常熱點,在不停的扛著大并發,大并發集中對這個key進行訪問,當這個key突然失效的瞬間(快取設定的過期時間,好比淘寶在特點時間搞活動),有大量并發就會穿破快取,直接訪問資料庫;導致資料庫的壓力瞬間過大,很有可能資料庫宕機【大量快取失效,需要訪問資料庫重新拿快取;重寫寫入快取資料庫】(在這個程序時DB的壓力會瞬間過大)

出現的原因
- 設定了過期時間的key
- 高并發地訪問該key,恰好這個key過期時間到了
解決方案
(1)預先設定熱門資料
在Redis高峰訪問之前,把一些熱門資料提前存入Redis中,并且加大這些熱門資料key的時長
(2)使用鎖

3、快取雪崩
快取雪崩:指在某一個時間段,快取集中過期失效,Redis宕機,
出現的原因
- 鍵值都集中存放到快取,快取時間都是一定的,過了一段時間鍵值集中過期
- 大面積的快取擊穿或者服務不可用
比如在雙十一0點活動,一些商品集中存放到快取;假設一個小時后(凌晨一點結束)快取都過期,卡點再次對這些商品訪問,都會直接訪問資料庫上,對于資料庫壓力相當大,很可能資料庫直接宕機,
其實集中過期,倒不是非常致命,比較致命快取雪崩是快取服務器在某個節點宕機或者斷網,

解決方案
(1)構建多級快取架構:nginx快取 + redis快取 +其他快取(ehcache等)
(2)使用鎖或佇列
用加鎖或者佇列的方式保證來保證不會有大量的執行緒對資料庫一次性進行讀寫,從而避免失效時大量的并發請求落到底層存盤系統上,
(3)將快取失效時間分散開
可以在原有的失效時間基礎上增加一個隨機值,比如1-5分鐘隨機,這樣每一個快取的過期時間的重復率就會降低,就很難引發集體失效的事件,
4、小結
快取穿透:是在 快取 和 資料庫 都查不到
快取擊穿:是 量太大 快取過期(某一個鍵值過期)
快取雪崩 和 快取擊穿 的區別 : 快取雪崩式很多key過期 快取擊穿 是 某一個key過期,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282287.html
標籤:其他
上一篇:集成演算法
