您好,登錄后才能下訂單哦!
這篇文章主要介紹了redis緩存雪崩、緩存擊穿和緩存穿透是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇redis緩存雪崩、緩存擊穿和緩存穿透是什么文章都會有所收獲,下面我們一起來看看吧。
首先來看看緩存雪崩,緩存雪崩的概念就是:大量的請求沒有在Redis緩存中得到處理,從而導致請求都涌入到數據庫中,然后數據庫的壓力劇增。
引起緩存雪崩的原因可總結為2個:
緩存中有大量的數據同時過期,這樣此時大量的請求都懟到數據庫了。
Redis緩存實例發生故障了,無法處理大量請求,也會導致請求都跑到數據庫去了。
先來看看第一個場景:緩存中大量的數據同時過期問題。
結合圖例來看,就是大量的數據在同一時間過期,然后此時又有很多的請求要讀取這些數據。當然就會發生緩存雪崩,從而導致數據庫壓力劇增了。
應對大量數據同時過期問題,通常有2種方案:
數據過期設置增加隨機時間:也就是用expire命令給數據設置過期時間時,增加一個隨機的時間,比如數據a是5分鐘過期,在5分鐘的基礎上隨機增加10-120秒時間。這樣就能避免大量數據同時過期。
服務降級:也就是發生緩存雪崩時,(1)若訪問的不是核心數據,當沒有緩存命中時,不去數據庫了,直接返回預先設置好的信息,比如空值或者錯誤信息;(2)當訪問的是核心數據,緩存未命中時,允許去數據庫查詢。這樣就將不是核心數據的請求都拒絕懟到數據庫了。
看完了大量數據同時過期的情況,再來看看Redis緩存實例故障的情況。
這種情況下,Redis無法處理讀請求了,請求自然就懟到數據庫了。
通常來說,應對這種情況,我們也有2種方式:
在業務系統中做好服務熔斷/請求限流。
事前預防:構建Redis高可靠集群,比如主從集群的主備切換。
服務熔斷,也就是當Redis發生故障時,暫停請求對緩存系統的訪問。等到Redis恢復正常了再打開請求訪問。
這種方式我們需要對Redis或數據庫的運行狀態進行監控,比如MySQL的負載壓力、Redis的CPU使用率、內存使用率及QPS等。當發現Redis實例緩存雪崩了,就暫停服務。
這種情況能有效放置大量請求對數據庫造成壓力。但是會暫停請求訪問,對業務端的影響很大。
因此,為了減少對業務端的影響,我們可以使用請求限流方式,控制QPS,避免過多的請求懟到數據庫去。比如下面圖例,本身有2萬每秒的請求,但因為Redis故障宕機了。我們限流操作將qps降到2千每秒,數據庫處理2000的qps還是沒問題的。
緩存擊穿就是指個別訪問頻繁的熱點數據無法緩存命中,然后請求都涌入到數據庫中。它經常會在熱點數據過期時發生。
對于緩存擊穿問題,我們知道這些都是被訪問非常頻繁的熱點數據,處理方式就簡單粗暴了,直接不設置過期時間了。等熱點數據不頻繁訪問再手動處理即可。
緩存雪崩有些特別,它是指要訪問的數據既不在Redis緩存,也不在數據庫中。當大量請求進到系統時,Redis和數據庫都會有巨大壓力。
導致緩存穿透的原因通常有2種:
數據被誤刪除了,導致緩存和數據庫都沒有數據了。然而客戶端是不知道的,還在瘋狂請求。
有惡意攻擊的情況:也就是被人盯上了,專門去查沒有的數據。
對于緩存穿透的情況,解決方案可以參考下面幾種:
是對緩存設置空值或者默認值。 比如發生緩存穿透時,在Redis緩存中設置空值/默認值。后續查詢該值時就直接返回這個默認值了。
使用布隆過濾器來判斷數據是否存在,避免從數據庫查詢。
在前端就進行請求檢測。 比如在前端將一些不合法的請求直接過濾,不要發到后端來處理。
第一點和第三點比較容易理解,這里就不展開描述。我們重點來看看第二點:布隆過濾器。
布隆過濾器主要用于判斷一個元素是否在一個集合中。它是由一個固定大小的二進制向量(可理解成默認為0的bit數組)和一系列的映射函數組成的。
我們首先來看看布隆過濾器是如何標記一個數據a的:
第一步,會使用到多個映射函數(哈希函數),每個函數都會計算這個數據a的哈希值;
第二步,這些計算得出的哈希值會分別對bit數組長度取模,這樣就得到每個哈希值在數組上的位置;
第三步,把第二步得到的位置,分別在bit數組上設置為1。
通過這3個步驟,數據標記就完成了。然后要查詢數據在不在的時候是這樣做的:
先計算這個數據在bit數組中的多個位置;
然后分別查看bit數組的這些位置的bit值。只有每個位置的bit值都為1,說明數據才可能存在,否則數據一定不存在。
結合下圖來看,基本原理就是這樣。
關于“redis緩存雪崩、緩存擊穿和緩存穿透是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“redis緩存雪崩、緩存擊穿和緩存穿透是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。