共計 1997 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要介紹了 redis 緩存雪崩、緩存擊穿和緩存穿透是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇 redis 緩存雪崩、緩存擊穿和緩存穿透是什么文章都會有所收獲,下面我們一起來看看吧。
緩存雪崩
首先來看看緩存雪崩,緩存雪崩的概念就是:大量的請求沒有在 Redis 緩存中得到處理,從而導致請求都涌入到數據庫中,然后數據庫的壓力劇增。
引起緩存雪崩的原因可總結為 2 個:
緩存中有大量的數據同時過期,這樣此時大量的請求都懟到數據庫了。
Redis 緩存實例發生故障了,無法處理大量請求,也會導致請求都跑到數據庫去了。
先來看看第一個場景:緩存中大量的數據同時過期問題。
緩存中大量的數據同時過期
結合圖例來看,就是大量的數據在同一時間過期,然后此時又有很多的請求要讀取這些數據。當然就會發生緩存雪崩,從而導致數據庫壓力劇增了。
大量數據同時過期的解決方案
應對大量數據同時過期問題,通常有 2 種方案:
數據過期設置增加隨機時間:也就是用 expire 命令給數據設置過期時間時,增加一個隨機的時間,比如數據 a 是 5 分鐘過期,在 5 分鐘的基礎上隨機增加 10-120 秒時間。這樣就能避免大量數據同時過期。
服務降級:也就是發生緩存雪崩時,(1)若訪問的不是核心數據,當沒有緩存命中時,不去數據庫了,直接返回預先設置好的信息,比如空值或者錯誤信息;(2)當訪問的是核心數據,緩存未命中時,允許去數據庫查詢。這樣就將不是核心數據的請求都拒絕懟到數據庫了。
看完了大量數據同時過期的情況,再來看看 Redis 緩存實例故障的情況。
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 緩存雪崩、緩存擊穿和緩存穿透是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道。