久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

167次閱讀
沒有評論

共計 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 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計1997字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 文登市| 大同县| 依兰县| 滨海县| 玛纳斯县| 讷河市| 通城县| 玉溪市| 西乡县| 龙胜| 陇南市| 营山县| 红安县| 中山市| 紫云| 横山县| 柏乡县| 日喀则市| 嫩江县| 黎平县| 勃利县| 江西省| 三江| 绥化市| 京山县| 永清县| 三明市| 文山县| 景谷| 离岛区| 云和县| 临沂市| 慈利县| 长垣县| 利辛县| 绥滨县| 东乡| 商丘市| 台南县| 平昌县| 黄梅县|