中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis緩存雪崩、緩存擊穿和緩存穿透是什么

發布時間:2022-11-15 09:32:07 來源:億速云 閱讀:107 作者:iii 欄目:關系型數據庫

這篇文章主要介紹了redis緩存雪崩、緩存擊穿和緩存穿透是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇redis緩存雪崩、緩存擊穿和緩存穿透是什么文章都會有所收獲,下面我們一起來看看吧。

緩存雪崩

首先來看看緩存雪崩,緩存雪崩的概念就是:大量的請求沒有在Redis緩存中得到處理,從而導致請求都涌入到數據庫中,然后數據庫的壓力劇增。

引起緩存雪崩的原因可總結為2個:

  • 緩存中有大量的數據同時過期,這樣此時大量的請求都懟到數據庫了。

  • Redis緩存實例發生故障了,無法處理大量請求,也會導致請求都跑到數據庫去了。

先來看看第一個場景:緩存中大量的數據同時過期問題。

緩存中大量的數據同時過期

結合圖例來看,就是大量的數據在同一時間過期,然后此時又有很多的請求要讀取這些數據。當然就會發生緩存雪崩,從而導致數據庫壓力劇增了。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

大量數據同時過期的解決方案

應對大量數據同時過期問題,通常有2種方案:

  • 數據過期設置增加隨機時間:也就是用expire命令給數據設置過期時間時,增加一個隨機的時間,比如數據a是5分鐘過期,在5分鐘的基礎上隨機增加10-120秒時間。這樣就能避免大量數據同時過期。

  • 服務降級:也就是發生緩存雪崩時,(1)若訪問的不是核心數據,當沒有緩存命中時,不去數據庫了,直接返回預先設置好的信息,比如空值或者錯誤信息;(2)當訪問的是核心數據,緩存未命中時,允許去數據庫查詢。這樣就將不是核心數據的請求都拒絕懟到數據庫了。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

看完了大量數據同時過期的情況,再來看看Redis緩存實例故障的情況。

Redis緩存實例故障導致的緩存雪崩

這種情況下,Redis無法處理讀請求了,請求自然就懟到數據庫了。

通常來說,應對這種情況,我們也有2種方式:

  • 在業務系統中做好服務熔斷/請求限流

  • 事前預防:構建Redis高可靠集群,比如主從集群的主備切換。

服務熔斷,也就是當Redis發生故障時,暫停請求對緩存系統的訪問。等到Redis恢復正常了再打開請求訪問。

這種方式我們需要對Redis或數據庫的運行狀態進行監控,比如MySQL的負載壓力、Redis的CPU使用率、內存使用率及QPS等。當發現Redis實例緩存雪崩了,就暫停服務。

這種情況能有效放置大量請求對數據庫造成壓力。但是會暫停請求訪問,對業務端的影響很大。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

因此,為了減少對業務端的影響,我們可以使用請求限流方式,控制QPS,避免過多的請求懟到數據庫去。比如下面圖例,本身有2萬每秒的請求,但因為Redis故障宕機了。我們限流操作將qps降到2千每秒,數據庫處理2000的qps還是沒問題的。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

緩存擊穿

緩存擊穿就是指個別訪問頻繁的熱點數據無法緩存命中,然后請求都涌入到數據庫中。它經常會在熱點數據過期時發生。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

對于緩存擊穿問題,我們知道這些都是被訪問非常頻繁的熱點數據,處理方式就簡單粗暴了,直接不設置過期時間了。等熱點數據不頻繁訪問再手動處理即可。

緩存穿透

緩存雪崩有些特別,它是指要訪問的數據既不在Redis緩存,也不在數據庫中。當大量請求進到系統時,Redis和數據庫都會有巨大壓力。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

導致緩存穿透的原因通常有2種:

  • 數據被誤刪除了,導致緩存和數據庫都沒有數據了。然而客戶端是不知道的,還在瘋狂請求。

  • 有惡意攻擊的情況:也就是被人盯上了,專門去查沒有的數據。

對于緩存穿透的情況,解決方案可以參考下面幾種:

  • 是對緩存設置空值或者默認值。 比如發生緩存穿透時,在Redis緩存中設置空值/默認值。后續查詢該值時就直接返回這個默認值了。

  • 使用布隆過濾器來判斷數據是否存在,避免從數據庫查詢。

  • 在前端就進行請求檢測。 比如在前端將一些不合法的請求直接過濾,不要發到后端來處理。

第一點和第三點比較容易理解,這里就不展開描述。我們重點來看看第二點:布隆過濾器。

布隆過濾器

布隆過濾器主要用于判斷一個元素是否在一個集合中。它是由一個固定大小的二進制向量(可理解成默認為0的bit數組)和一系列的映射函數組成的。

我們首先來看看布隆過濾器是如何標記一個數據a的:

  • 第一步,會使用到多個映射函數(哈希函數),每個函數都會計算這個數據a的哈希值;

  • 第二步,這些計算得出的哈希值會分別對bit數組長度取模,這樣就得到每個哈希值在數組上的位置;

  • 第三步,把第二步得到的位置,分別在bit數組上設置為1。

通過這3個步驟,數據標記就完成了。然后要查詢數據在不在的時候是這樣做的:

  • 先計算這個數據在bit數組中的多個位置;

  • 然后分別查看bit數組的這些位置的bit值。只有每個位置的bit值都為1,說明數據才可能存在,否則數據一定不存在。

結合下圖來看,基本原理就是這樣。

redis緩存雪崩、緩存擊穿和緩存穿透是什么

關于“redis緩存雪崩、緩存擊穿和緩存穿透是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“redis緩存雪崩、緩存擊穿和緩存穿透是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扶风县| 平安县| 施甸县| 广东省| 南木林县| 孝感市| 饶平县| 景谷| 嵊泗县| 河曲县| 云梦县| 仲巴县| 政和县| 中卫市| 任丘市| 永吉县| 龙门县| 彰化县| 遵化市| 荣成市| 哈尔滨市| 蓝田县| 隆回县| 乐业县| 邵东县| 溧水县| 汽车| 米易县| 福建省| 杨浦区| 万山特区| 玉龙| 永春县| 盐边县| 海淀区| 科技| 开封市| 墨竹工卡县| 海伦市| 泽库县| 泗洪县|