欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis緩存異常之緩存雪崩問題解讀

 更新時間:2025年01月15日 10:00:37   作者:Recently 祝祝  
文章主要介紹了緩存雪崩、擊穿和穿透問題,以及針對這些問題的解決方法,包括服務(wù)熔斷、服務(wù)降級、請求限流和布隆過濾器等

緩存異常:緩存雪崩、擊穿、穿透

當(dāng)發(fā)生緩存雪崩或擊穿時,數(shù)據(jù)庫中還是保存了應(yīng)用要訪問的數(shù)據(jù)。

緩存擊穿,緩存更數(shù)據(jù)庫中都沒有應(yīng)用要訪問的數(shù)據(jù)。

1.緩存雪崩

1.1了解

緩存雪崩是指大量的應(yīng)用請求無法在 Redis 緩存中進行處理,緊接著,應(yīng)用將大量請求發(fā)送到數(shù)據(jù)庫層,導(dǎo)致數(shù)據(jù)庫層的壓力激增。

1.2第一個原因是:緩存大量過期

緩存中有大量數(shù)據(jù)同時過期,導(dǎo)致大量請求無法得到處理。

具體說明:

當(dāng)數(shù)據(jù)保存在緩存中,并且設(shè)置了過期時間時--》某一個時刻,大量數(shù)據(jù)同時過期--》應(yīng)用再次訪問這些數(shù)據(jù),發(fā)生緩存缺失--》應(yīng)用把請求發(fā)送給數(shù)據(jù)庫,從數(shù)據(jù)庫中讀取數(shù)據(jù)--》應(yīng)用并發(fā)請求量大,數(shù)據(jù)庫壓力大,影響數(shù)據(jù)庫正常業(yè)務(wù)請求處理

第一種解決方式:微調(diào)緩存過期時間

如果業(yè)務(wù)層的確要求有些數(shù)據(jù)同時失效,在使用 EXPIRE 命令給每個數(shù)據(jù)設(shè)置過期時間時,給這些數(shù)據(jù)的過期時間增加一個較小的隨機數(shù)(例如,隨機增加 1~3 分鐘)。

設(shè)置之后:不同數(shù)據(jù)的過期時間有所差別,但差別又不會太大,既避免了大量數(shù)據(jù)同時過期,同時也保證了這些數(shù)據(jù)基本在相近的時間失效,仍然能滿足業(yè)務(wù)需求

第二種解決方式:服務(wù)降級

  • 當(dāng)業(yè)務(wù)應(yīng)用訪問的是非核心數(shù)據(jù)(例如電商商品屬性)時,暫時停止從緩存中查詢這些數(shù)據(jù),而是直接返回預(yù)定義信息、空值或是錯誤信息;
  • 當(dāng)業(yè)務(wù)應(yīng)用訪問的是核心數(shù)據(jù)(例如電商商品庫存)時,仍然允許查詢緩存,如果緩存缺失,也可以繼續(xù)通過數(shù)據(jù)庫讀取。

只有部分過期數(shù)據(jù)的請求會發(fā)送到數(shù)據(jù)庫,數(shù)據(jù)庫的壓力沒有那么大。

下面這張圖顯示的是服務(wù)降級時數(shù)據(jù)請求的執(zhí)行情況:

1.3第二個原因:Redis 緩存實例發(fā)生故障宕機

Redis 緩存實例發(fā)生故障宕機了,無法處理請求,這就會導(dǎo)致大量請求一下子積壓到數(shù)據(jù)庫層,從而發(fā)生緩存雪崩。

說明:

  • 1個 Redis 實例可以支持?jǐn)?shù)萬級別的請求處理吞吐量,而單個數(shù)據(jù)庫可能只能支持?jǐn)?shù)千級別的請求處理吞吐量,它們兩個的處理能力可能相差了近十倍。
  • 由于緩存雪崩,Redis 緩存失效,所以,數(shù)據(jù)庫就可能要承受近十倍的請求壓力,從而因為壓力過大而崩潰。

第一種解決方式:是在業(yè)務(wù)系統(tǒng)中實現(xiàn)服務(wù)熔斷或請求限流機制

服務(wù)熔斷

服務(wù)熔斷:是指在發(fā)生緩存雪崩時,暫停業(yè)務(wù)應(yīng)用對緩存系統(tǒng)的接口訪問。為了防止引發(fā)連鎖的數(shù)據(jù)庫雪崩,甚至是整個系統(tǒng)的崩潰。

業(yè)務(wù)應(yīng)用調(diào)用緩存接口--》緩存客戶端不把請求發(fā)給 Redis 緩存實例--》Redis 緩存實例重新恢復(fù)服務(wù)后--》允許應(yīng)用請求發(fā)送到緩存系統(tǒng)。

避免了大量請求因緩存缺失,而積壓到數(shù)據(jù)庫系統(tǒng),保證了數(shù)據(jù)庫系統(tǒng)的正常運行。

在業(yè)務(wù)系統(tǒng)運行監(jiān)測 Redis 緩存所在機器和數(shù)據(jù)庫所在機器的負(fù)載指標(biāo),例如每秒請求數(shù)、CPU 利用率、內(nèi)存利用率等。---》發(fā)現(xiàn) Redis 緩存實例宕機了,而數(shù)據(jù)庫所在機器的負(fù)載壓力突然增加(例如每秒請求數(shù)激增)--》緩存雪崩--》大量請求被發(fā)送到數(shù)據(jù)庫進行處理--》啟動服務(wù)熔斷機制,暫停業(yè)務(wù)應(yīng)用對緩存服務(wù)的訪問。

降低對數(shù)據(jù)庫的訪問壓力,如下所示:

服務(wù)熔斷雖然可以保證數(shù)據(jù)庫的正常運行,但是暫停了整個緩存系統(tǒng)的訪問,對業(yè)務(wù)應(yīng)用的影響范圍大

請求限流機制

請求限流:在業(yè)務(wù)系統(tǒng)的請求入口前端控制每秒進入系統(tǒng)的請求數(shù),避免過多的請求被發(fā)送到數(shù)據(jù)庫。

例子:

  • 假設(shè)業(yè)務(wù)系統(tǒng)正常運行時,請求入口前端允許每秒進入系統(tǒng)的請求是 1 萬個,其中,9000 個請求都能在緩存系統(tǒng)中進行處理,只有 1000 個請求會被應(yīng)用發(fā)送到數(shù)據(jù)庫進行處理。
  • 一旦發(fā)生了緩存雪崩,數(shù)據(jù)庫的每秒請求數(shù)突然增加到每秒 1 萬個,可以啟動請求限流機制,在請求入口前端只允許每秒進入系統(tǒng)的請求數(shù)為 1000 個,再多的請求就會在入口前端被直接拒絕服務(wù)。
  • 使用了請求限流,就可以避免大量并發(fā)請求壓力傳遞到數(shù)據(jù)庫層。
  • 服務(wù)熔斷或是請求限流機制。都是發(fā)生雪崩之后采取的措施,來應(yīng)對 Redis 實例宕機導(dǎo)致的緩存雪崩問題。來降低雪崩對數(shù)據(jù)庫和整個業(yè)務(wù)系統(tǒng)的影響。

第二種解決方式:事前預(yù)防

通過主從節(jié)點的方式構(gòu)建 Redis 緩存高可靠集群。如果 Redis 緩存的主節(jié)點故障宕機了,從節(jié)點還可以切換成為主節(jié)點,繼續(xù)提供緩存服務(wù),避免了由于緩存實例宕機而導(dǎo)致的緩存雪崩問題。

2.緩存擊穿

2.1了解

緩存擊穿是指,針對某個訪問非常頻繁的熱點數(shù)據(jù)的請求,無法在緩存中進行處理,訪問該數(shù)據(jù)的大量請求,一下子都發(fā)送到了后端數(shù)據(jù)庫,導(dǎo)致了數(shù)據(jù)庫壓力激增,會影響數(shù)據(jù)庫處理其他請求。緩存擊穿的情況,經(jīng)常發(fā)生在熱點數(shù)據(jù)過期失效時:

2.2解決方式

為了避免緩存擊穿給數(shù)據(jù)庫帶來的激增壓,對于訪問特別頻繁的熱點數(shù)據(jù),不設(shè)置過期時間。

對熱點數(shù)據(jù)的訪問請求,都可以在緩存中進行處理,而 Redis 數(shù)萬級別的高吞吐量可以很好地應(yīng)對大量的并發(fā)請求訪問。

3.緩存穿透

3.1了解

緩存穿透是指要訪問的數(shù)據(jù)既不在 Redis 緩存中,也不在數(shù)據(jù)庫中,導(dǎo)致請求在訪問緩存時,發(fā)生緩存缺失,再去訪問數(shù)據(jù)庫時,發(fā)現(xiàn)數(shù)據(jù)庫中也沒有要訪問的數(shù)據(jù),應(yīng)用也無法從數(shù)據(jù)庫中讀取數(shù)據(jù)再寫入緩存,來服務(wù)后續(xù)請求。緩存也就成了“擺設(shè)”,如果應(yīng)用持續(xù)有大量請求訪問數(shù)據(jù),就會同時給緩存和數(shù)據(jù)庫帶來巨大壓力

3.2緩存穿透會發(fā)生兩種情況

  • 業(yè)務(wù)層誤操作:緩存中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)被誤刪除了,所以緩存和數(shù)據(jù)庫中都沒有數(shù)據(jù);
  • 惡意攻擊:專門訪問數(shù)據(jù)庫中沒有的數(shù)據(jù)。

3.3第一種解決方式

緩存空值或缺省值

一旦發(fā)生緩存穿透,可以針對查詢的數(shù)據(jù),在 Redis 中緩存一個空值或是和業(yè)務(wù)層協(xié)商確定的缺省值(例如,庫存的缺省值可以設(shè)為 0)。

緊接著,應(yīng)用發(fā)送的后續(xù)請求再進行查詢時,就可以直接從 Redis 中讀取空值或缺省值,返回給業(yè)務(wù)應(yīng)用了,避免了把大量請求發(fā)送給數(shù)據(jù)庫處理,保持了數(shù)據(jù)庫的正常運行。

3.4第二種解決方式

使用布隆過濾器快速判斷數(shù)據(jù)是否存在,避免從數(shù)據(jù)庫中查詢數(shù)據(jù)是否存在,減輕數(shù)據(jù)庫壓力。

布隆過濾器是如何工作?

布隆過濾器由一個初值都為 0 的 bit 數(shù)組和 N 個哈希函數(shù)組成,可以用來快速判斷某個數(shù)據(jù)是否存在,想標(biāo)記某個數(shù)據(jù)存在時(例如,數(shù)據(jù)已被寫入數(shù)據(jù)庫),布隆過濾器會通過三個操作完成標(biāo)記:

  1. 首先,使用 N 個哈希函數(shù),分別計算這個數(shù)據(jù)的哈希值,得到 N 個哈希值。
  2. 然后,把這 N 個哈希值對 bit 數(shù)組的長度取模,得到每個哈希值在數(shù)組中的對應(yīng)位置
  3. 最后,把對應(yīng)位置的 bit 位設(shè)置為 1,這就完成了在布隆過濾器中標(biāo)記數(shù)據(jù)的操作。

如果數(shù)據(jù)不存在(例如,數(shù)據(jù)庫里沒有寫入數(shù)據(jù)),也就沒有用布隆過濾器標(biāo)記過數(shù)據(jù),那么,bit 數(shù)組對應(yīng) bit 位的值仍然為 0

布隆過濾器查詢

當(dāng)需要查詢某個數(shù)據(jù)時,執(zhí)行計算過程,先得到這個數(shù)據(jù)在 bit 數(shù)組中對應(yīng)的 N 個位置。查看 bit 數(shù)組中這 N 個位置上的 bit 值。只要這 N 個 bit 值有一個不為 1,這就表明布隆過濾器沒有對該數(shù)據(jù)做過標(biāo)記,所以,查詢的數(shù)據(jù)一定沒有在數(shù)據(jù)庫中保存。

圖中布隆過濾器是一個包含 10 個 bit 位的數(shù)組,使用了 3 個哈希函數(shù),當(dāng)在布隆過濾器中標(biāo)記數(shù)據(jù) X 時,X 會被計算 3 次哈希值,并對 10 取模,取模結(jié)果分別是 1、3、7。所以,bit 數(shù)組的第 1、3、7 位被設(shè)置為 1。當(dāng)應(yīng)用想要查詢 X 時,只要查看數(shù)組的第 1、3、7 位是否為 1,只要有一個為 0,那么,X 就肯定不在數(shù)據(jù)庫中。

基于布隆過濾器的快速檢測特性,在把數(shù)據(jù)寫入數(shù)據(jù)庫時,使用布隆過濾器做個標(biāo)記。當(dāng)緩存缺失后,應(yīng)用查詢數(shù)據(jù)庫時,可以通過查詢布隆過濾器快速判斷數(shù)據(jù)是否存在。如果不存在,就不用再去數(shù)據(jù)庫中查詢了。防止緩存穿透。大量請求只會查詢 Redis 和布隆過濾器,而不會積壓到數(shù)據(jù)庫,也就不會影響數(shù)據(jù)庫的正常運行。布隆過濾器可以使用 Redis 實現(xiàn),本身就能承擔(dān)較大的并發(fā)訪問壓力。

3.5第三種解決方式

在請求入口的前端進行請求檢測

一個有效的應(yīng)對方案是在請求入口前端,對業(yè)務(wù)系統(tǒng)接收到的請求進行合法性檢測,把惡意的請求(例如請求參數(shù)不合理、請求參數(shù)是非法值、請求字段不存在)直接過濾掉,不讓它們訪問后端緩存和數(shù)據(jù)庫。

這樣一來,也就不會出現(xiàn)緩存穿透問題了。

4.小結(jié):緩存三劍客:緩存雪崩、擊穿、穿透

4.1主要分析

  1. 緩存雪崩和擊穿主要是因為數(shù)據(jù)不在緩存中了
  2. 緩存穿透則是因為數(shù)據(jù)既不在緩存中,也不在數(shù)據(jù)庫中。
  3. 緩存雪崩或擊穿時,一旦數(shù)據(jù)庫中的數(shù)據(jù)被再次寫入到緩存后,應(yīng)用又可以在緩存中快速訪問數(shù)據(jù)了,數(shù)據(jù)庫的壓力也會相應(yīng)地降低下來,
  4. 緩存穿透發(fā)生時,Redis 緩存和數(shù)據(jù)庫會同時持續(xù)承受請求壓力。

4.4方案分析

服務(wù)熔斷、服務(wù)降級、請求限流這些方法都是屬于“有損”方案,在保證數(shù)據(jù)庫和整體系統(tǒng)穩(wěn)定的同時,會對業(yè)務(wù)應(yīng)用帶來負(fù)面影響。例如使用服務(wù)降級時,有部分?jǐn)?shù)據(jù)的請求就只能得到錯誤返回信息,無法正常處理。如果使用了服務(wù)熔斷,那么,整個緩存系統(tǒng)的服務(wù)都被暫停了,影響的業(yè)務(wù)范圍更大。而使用了請求限流機制后,整個業(yè)務(wù)系統(tǒng)的吞吐率會降低,能并發(fā)處理的用戶請求會減少,會影響到用戶體驗。

緩存雪崩和擊穿問題來說,服務(wù)熔斷、服務(wù)降級和請求限流這三種方法屬于有損方法,會降低業(yè)務(wù)吞吐量、拖慢系統(tǒng)響應(yīng)、降低用戶體驗。不過,采用這些方法后,隨著數(shù)據(jù)慢慢地重新填充回 Redis,Redis 還是可以逐步恢復(fù)緩存層作用的。

4.3預(yù)防式方案

  1. 針對緩存雪崩,合理地設(shè)置數(shù)據(jù)過期時間,以及搭建高可靠緩存集群;
  2. 針對緩存擊穿,在緩存訪問非常頻繁的熱點數(shù)據(jù)時,不要設(shè)置過期時間;
  3. 針對緩存穿透,提前在入口前端實現(xiàn)惡意請求檢測,或者規(guī)范數(shù)據(jù)庫的數(shù)據(jù)刪除操作,避免誤刪除。

在講到緩存雪崩時,我提到,可以采用服務(wù)熔斷、服務(wù)降級、請求限流的方法來應(yīng)對。這三個機制可以用來應(yīng)對緩存穿透問題嗎?

緩存穿透這個問題的本質(zhì)是查詢了 Redis 和數(shù)據(jù)庫中沒有的數(shù)據(jù),而服務(wù)熔斷、服務(wù)降級和請求限流的方法,本質(zhì)上是為了解決 Redis 實例沒有起到緩存層作用的問題,緩存雪崩和緩存擊穿都屬于這類問題。

在緩存穿透的場景下,業(yè)務(wù)應(yīng)用是要從 Redis 和數(shù)據(jù)庫中讀取不存在的數(shù)據(jù),此時,如果沒有人工介入,Redis 是無法發(fā)揮緩存作用的。一個可行的辦法就是事前攔截,不讓這種查詢 Redis 和數(shù)據(jù)庫中都沒有的數(shù)據(jù)的請求發(fā)送到數(shù)據(jù)庫層。使用布隆過濾器也是一個方法,布隆過濾器在判別數(shù)據(jù)不存在時,是不會誤判的,而且判斷速度非常快,一旦判斷數(shù)據(jù)不存在,就立即給客戶端返回結(jié)果。使用布隆過濾器的好處是既降低了對 Redis 的查詢壓力,也避免了對數(shù)據(jù)庫的無效訪問。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis添加商鋪查詢緩存功能實現(xiàn)

    Redis添加商鋪查詢緩存功能實現(xiàn)

    文章主要介紹了如何使用流程圖來設(shè)計實現(xiàn)邏輯,并詳細(xì)講解了Service層的實現(xiàn)方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-03-03
  • Redis實現(xiàn)延遲任務(wù)的常見方案詳解

    Redis實現(xiàn)延遲任務(wù)的常見方案詳解

    延遲任務(wù)(Delayed?Task)是指在未來的某個時間點,執(zhí)行相應(yīng)的任務(wù),本文為大家整理了Redis實現(xiàn)延遲任務(wù)的幾個常見方案,希望對大家有所幫助
    2024-04-04
  • Redis主從同步配置的方法步驟(圖文)

    Redis主從同步配置的方法步驟(圖文)

    這篇文章主要介紹了Redis主從同步配置的方法步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • redis?setex使用方法示例代碼

    redis?setex使用方法示例代碼

    SETEX?是?Redis?中的一個命令,用于設(shè)置鍵的值以及過期時間(以秒為單位),這篇文章主要介紹了redis?setex使用方法,需要的朋友可以參考下
    2024-07-07
  • 通過實例解析布隆過濾器工作原理及實例

    通過實例解析布隆過濾器工作原理及實例

    這篇文章主要介紹了通過實例解析布隆過濾器工作原理及實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • k8s部署redis cluster集群的實現(xiàn)

    k8s部署redis cluster集群的實現(xiàn)

    在Kubernetes中部署Redis集群面臨挑戰(zhàn),因為每個Redis實例都依賴于一個配置文件,該文件可以跟蹤其他集群實例及其角色。需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Redis動態(tài)字符串SDS的實現(xiàn)

    Redis動態(tài)字符串SDS的實現(xiàn)

    SDS在Redis中是實現(xiàn)字符串對象的工具,本文主要介紹了Redis動態(tài)字符串SDS的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Redis過期數(shù)據(jù)是否會被立馬刪除

    Redis過期數(shù)據(jù)是否會被立馬刪除

    這篇文章主要為大家介紹了Redis過期數(shù)據(jù)會被立馬刪除么的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Redis?HyperLogLog數(shù)據(jù)統(tǒng)計輕量級解決方案詳解

    Redis?HyperLogLog數(shù)據(jù)統(tǒng)計輕量級解決方案詳解

    這篇文章主要為大家介紹了Redis?HyperLogLog數(shù)據(jù)統(tǒng)計輕量級解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 實現(xiàn)在線?+?離線模式進行遷移?Redis?數(shù)據(jù)實戰(zhàn)指南

    實現(xiàn)在線?+?離線模式進行遷移?Redis?數(shù)據(jù)實戰(zhàn)指南

    這篇文章主要介紹了實現(xiàn)在線?+?離線模式進行遷移?Redis?數(shù)據(jù)實戰(zhàn)指南的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評論