什么是Redis快取穿透、快取擊穿、快取雪崩?
- 快取穿透
- 什么是快取穿透?
- 如何解決快取穿透?
- 快取空值
- BloomFilter布隆過濾器
- 快取擊穿
- 什么是快取擊穿
- 如何解決快取擊穿
- 異步定時更新
- 互斥鎖
- 快取雪崩
- 什么是快取雪崩?
- 如何避免快取雪崩?
- 設定不同的過期時間
- 使用快取集群
快取穿透
什么是快取穿透?
要把這個問題講清楚,先舉個例子,
一個女孩子去門店買口紅,到了門店之后被告知她想要的那個色號已經沒有了,于是她要求店員去問總部還有沒有貨,總部發現這個色號也沒有了,于是女孩子就離開了,
過了一會另一個女孩子又來了,也想要購買同一個色號,店員就又總部問了一次,如此反復,
女孩子買口紅不僅需要門店幫忙查詢,還需要總部也進行盤貨,類似這種情況,在快取領域有一個類似的概念叫做快取穿透,

快取穿透是指快取服務器中沒有快取資料,資料庫中也沒有符合條件的資料,導致業務系統每次都繞過快取服務器查詢下游的資料庫,快取服務器完全失去了其應有的作用,
如何解決快取穿透?
一般有2種解決辦法,分別是快取空值和過濾器
快取空值
在快取中,之所以會發生穿透,就是因為快取沒有對那些不存在的值得Key快取下來,從而導致每次查詢都要請求到資料庫,
那么我們就可以為這些key對應的值設定為null并放到快取中,這樣再出現查詢這個key 的請求的時候,直接回傳null即可 ,
但是還需要注意的就是需要有一個失效時間,因為如果不設定失效的話,如果哪天有值了就會導致問題,
BloomFilter布隆過濾器
很多時候,快取穿透是因為有很多惡意流量的請求,這些請求可能隨機生成很多Key來請求查詢,這些肯定在快取和資料庫中都沒有,那就很容易導致快取穿透,
在快取穿透防治上常用的技術是布隆過濾器(Bloom Filter),
布隆過濾器是一種比較巧妙的概率性資料結構,它可以告訴你資料一定不存在或可能存在,相比Map、Set、List等傳統資料結構它占用記憶體少、結構更高效,
對于快取穿透,我們可以將查詢的資料條件都哈希到一個足夠大的布隆過濾器中,用戶發送的請求會先被布隆過濾器攔截,一定不存在的資料就直接攔截回傳了,從而避免下一步對資料庫的壓力,
快取擊穿
什么是快取擊穿
有一種比較特殊的情況,那就是如果某一個熱門色號的口紅剛好賣完了,這時候有很多顧客同時來咨詢要購買這個色號,那么門店內的多個售貨員可能分別給總部打電話咨詢是否有存貨,那么總部接收到的咨詢量就會劇增,類似這種情況,在快取領域有一個類似的概念叫做快取擊穿,

快取擊穿是指當某一key的快取過期時大并發量的請求同時訪問此key,瞬間擊穿快取服務器直接訪問資料庫,讓資料庫處于負載的情況,
如何解決快取擊穿
一般有2種解決辦法,分別是異步定時更新和互斥鎖
異步定時更新
如果提前知道某一個色號比較暢銷的話,那就可以定時的咨詢總部是否還有存貨,定時的更新庫存情況就可以避免上面這種情況了,
在快取處理上,同理,比如某一個熱點資料的過期時間是1小時,那么每59分鐘,通過定時任務去更新這個熱點key,并重新設定其過期時間,
互斥鎖
還有一種解決辦法,那就是如果很多顧客咨詢的是同一個色號的口紅,那么就先處理第一個用戶的咨詢,其他同樣請求的顧客先排隊等待,一直到店員從總部那里獲取到最新的庫存資訊后,就可以安排其他人繼續購買了,
在快取處理上,通常使用一個互斥鎖來解決快取擊穿的問題,簡單來說就是當Redis中根據key獲得的value值為空時,先鎖上,然后從資料庫加載,加載完畢,釋放鎖,若其他執行緒也在請求該key時,發現獲取鎖失敗,則先阻塞,
快取雪崩
什么是快取雪崩?
如果門店內的多個色號的口紅同時售罄了,并且門店在這個時間點剛好也不知道總部有沒有庫存了,這時候如果有大量顧客來到門店購物的話,就會有更多的咨詢電話打到總部那里,
或者是門店突然出現問題了,不能提供服務了,很多顧客就可能自己打電話到總部咨詢庫存情況,類似這種情況,在快取領域有一個類似的概念叫做快取雪崩,

快取雪崩是指當大量快取同時過期或快取服務宕機,所有請求的都直接訪問資料庫,造成資料庫高負載,影響性能,甚至資料庫宕機,
如何避免快取雪崩?
避免的方法:設定不同的過期時間或者使用快取集群,
設定不同的過期時間
為了避免快取雪崩,門店可以考慮給不同的色號的口紅預留不同的庫存,并且采用不同的頻率咨詢總部庫存情況,更新到門店中,這樣就可以避免突然同一個時間點所有色號都售罄,
為了避免大量的快取在同一時間過期,可以把不同的key過期時間設定成不同的, 并且通過定時重繪的方式更新過期時間,
使用快取集群
在快取雪崩問題防治上面,一個比較典型的技術就是采用集群方式部署,使用集群可以避免服務單點故障,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/249455.html
標籤:其他
下一篇:apache安裝腳本
