搜尋
首頁資料庫Redis如何解決Redis緩存雪崩、擊穿與穿透

這篇文章為大家帶來了關於Redis的相關知識,其中主要介紹了關於怎麼解決redis緩存雪崩、擊穿與穿透的相關問題,緩存雪崩是指大量的請求無法命中Redis中的快取數據,也就是在Redis找不到數據了;下面一起來看一下,希望對大家有幫助。

如何解決Redis緩存雪崩、擊穿與穿透

推薦學習:Redis影片教學

#一、快取雪崩

1. 什麼是緩存雪崩?

快取雪崩是指大量的請求無法命中Redis中的快取數據,也就是在Redis找不到數據了,那業務系統只能到資料庫中查詢,進而導致所有的請求都傳送到了資料庫。如下圖所示:

資料庫不像Redis能處理大量請求,由快取雪崩導致的請求激增必須會導致資料庫所在宕機,這樣勢必會影響業務系統,所以如果發生緩存雪崩,對於業務系統肯定是致命的。

2. 為什麼發會生緩存雪崩?

什麼情況下出現快取雪崩呢?總結起來有以下兩個面向的原因:

  • 大量Redis快取資料同時過期,導致所有的發送到Redis請求都無法命中數據,只能到資料庫中進行查詢。

  • Redis伺服器宕機,所有請求都無法經Redis來處理,只能轉向資料庫查詢資料。

3. 如何避免快取雪崩?

針對導致快取雪崩的原因,有不同的解決方法:

  • 針對大量快取隨機過期時間,解決方法就是在原始過期時間的基礎上,再加上一個隨機過期時間,例如1到5分鐘之間的隨機過期時間,這樣可以避免大量的快取資料在同一時間過期。

  • 而針對Redis解決當機的導致的快取雪崩,可以提前搭建好Redis的主從伺服器進行資料同步,並配置哨兵機制,這樣在Redis伺服器因為宕機而無法提供服務時,可以由哨兵將Redis從伺服器設定為主伺服器,繼續提供服務。

二、快取擊穿

1. 什麼是快取擊穿

快取擊穿與快取雪崩的情況相似,雪崩是因為大量的資料過期,而快取擊穿則是指熱點資料過期,所有針對熱點資料的請求都需要到資料庫中處理,如下圖所示:

##2 . 怎麼避免快取擊穿?

解決快取擊穿的三種方式:

    不設定過期時間
如果我們能事先知道某個數據是熱點數據,那麼就可以不設定這些資料的過期,從而避免快取擊穿問題,例如一些秒殺活動的商品,在秒殺時會大量用戶訪問,這時候我們就可以將這些用於秒殺的商品資料提前寫入快取並且不設定過期時間。

    互斥鎖
提前知道某些資料會有大量訪問,我們當然可以設定不過期,但更多時候,我們並不能提前預知,這種情況要怎麼處理呢?

我們來分析快取擊穿的情況:

正常情況下,當某個

Redis快取資料過期時,如果有對該資料的請求,則重新到資料庫中查詢並再寫入緩存,讓後續的請求可以命中該快取而無須再去資料庫中查詢。

而熱點資料過期時,由於大量請求,當某個請求無法命中快取時,會去查詢資料庫並重新把資料寫入

Redis,也就是在寫入Redis之前,其他要求進來,也會去查詢資料庫。

好了,我們知道熱點資料過期後,很多請求會去查詢資料庫,那麼我們可以給去查詢資料庫的業務邏輯加個互斥鎖,只有獲得鎖的請求才能去查詢資料庫並把資料寫回

Redis,而其他沒有獲得鎖定的請求只能等待資料就緒。

上述步驟的如下圖所示:

#

  • 設定邏輯過期時間

使用互斥鎖雖然可以非常簡單地解決快取擊穿問題,但沒有獲得鎖的請求雖然排隊等待,這樣影響了系統的效能,還有另一種解決快取擊穿的方法就是在業務資料冗餘一個過期時間,例如下面的資料中我們增加了expire_at欄位用來表示資料過期時間。

{"name":"test","expire_at":"1599999999"}复制代码

這種方式的實作過程如下圖所示:

快取中的熱點資料中冗餘一個邏輯過期時間,但資料在Redis不設定過期時間

當一個請求拿到Redis中的資料時,判斷邏輯過期時間是否到期,如果沒有到期,直接傳回,如果到期則開啟另一個執行緒取得鎖定後去查詢資料庫並將查詢的最新資料寫回Redis,而目前請求傳回已查詢的資料。

三、快取穿透

1. 什麼是快取穿透

快取穿透是指要尋找的資料既不在快取當中,也不在資料庫中,因為不在快取中,所以請求一定會到達資料庫,Redis快取形同虛設,如下圖所示:

##2. 為什麼會發生快取穿透

在什麼條件下會發生快取穿透呢?主要有以下三種情況:

  • 用戶惡意攻擊請求

  • #錯誤操作把

    Redis和資料庫裡的數據刪除了

  • 用戶還未產生內容時,例如用戶的文章列表,用戶還未寫文章,所以快取和資料庫都沒有資料

3. 如何避免快取穿透?

a. 快取空值或預設值

當在

Redis快取中查詢不到資料時,再從資料庫查詢,如果同樣沒有數據,就直接快取一個空間或缺省值,這樣可以避免下次再去查詢資料庫;不過為了防止之後已經資料庫已經對應資料庫,再回傳空值問題,應該為快取設定過期時間,或是在產生資料時直接清除對應的快取空值。

b. 布隆過濾器

雖然快取空值可以解決快取穿透問題,但仍然需要查詢一次資料庫才能確定是否有數據,如果有用戶惡意攻擊,高並發地使用系統不存在的資料id進行查詢,所有的查詢都要經過資料庫,這樣仍然會給資料庫帶來很大的壓力。

所以,有沒有不用查詢資料庫就能確定資料是否存在的辦法呢?有的,用

布隆過濾器

布林過濾器主要是兩個部分:bit數組N個雜湊函數,其原理為:

  • 使用N個雜湊函數對要標記的數據進行哈希值計算。

  • 將計算到的雜湊值對bit數組的長度取模,這樣就可以得到每個哈希值在bit數組的位置。

  • 把bit數組中對應的位置標記為1。

下面是布隆過濾器原理示意圖:

#當要進行資料寫入時,執行述述步驟,計算對應bit數組位置並標識為1,那麼執行查詢時,就能查詢該資料是否存在了。

另外,由於哈希碰撞問題導致的誤差,所以不存在的資料經過布隆過濾器後,會被判定為存在,再去查資料庫,不過哈希碰到的機率很小,用布隆過濾器已經能幫我們攔截大部分的穿透要求了。

Redis本身就支援布隆過濾器,所以我們可以直接使用Redis布隆過濾器,而不用自己去實現,非常方便。

四、小結

快取的雪崩、擊穿、穿透是在業務應用快取時經常會碰到的快取異常問題,其原因與解決方法如以下表示所示:

問題原因解決方法##快取雪崩Redis #快取擊穿快取穿透Redis推薦學習:
大量資料過期或伺服器宕機#1. 隨機過期時間 2. 主從哨兵的叢集
熱點資料過期 1. 不設定過期時間2. 加上互斥鎖定3.冗餘邏輯過期時間
請求資料庫和都沒有的資料1. 快取空值或預設值2. 布隆過濾器
Redis影片教學

#

以上是如何解決Redis緩存雪崩、擊穿與穿透的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金。如有侵權,請聯絡admin@php.cn刪除
REDIS:探索其數據模型和結構REDIS:探索其數據模型和結構Apr 16, 2025 am 12:09 AM

Redis的數據模型和結構包括五種主要類型:1.字符串(String):用於存儲文本或二進制數據,支持原子操作。 2.列表(List):有序元素集合,適合隊列和堆棧。 3.集合(Set):無序唯一元素集合,支持集合運算。 4.有序集合(SortedSet):帶分數的唯一元素集合,適用於排行榜。 5.哈希表(Hash):鍵值對集合,適合存儲對象。

REDIS:對其數據庫方法進行分類REDIS:對其數據庫方法進行分類Apr 15, 2025 am 12:06 AM

Redis的數據庫方法包括內存數據庫和鍵值存儲。 1)Redis將數據存儲在內存中,讀寫速度快。 2)它使用鍵值對存儲數據,支持複雜數據結構,如列表、集合、哈希表和有序集合,適用於緩存和NoSQL數據庫。

為什麼要使用redis?利益和優勢為什麼要使用redis?利益和優勢Apr 14, 2025 am 12:07 AM

Redis是一個強大的數據庫解決方案,因為它提供了極速性能、豐富的數據結構、高可用性和擴展性、持久化能力以及廣泛的生態系統支持。 1)極速性能:Redis的數據存儲在內存中,讀寫速度極快,適合高並發和低延遲應用。 2)豐富的數據結構:支持多種數據類型,如列表、集合等,適用於多種場景。 3)高可用性和擴展性:支持主從復制和集群模式,實現高可用性和水平擴展。 4)持久化和數據安全:通過RDB和AOF兩種方式實現數據持久化,確保數據的完整性和可靠性。 5)廣泛的生態系統和社區支持:擁有龐大的生態系統和活躍社區,

了解NOSQL:Redis的關鍵特徵了解NOSQL:Redis的關鍵特徵Apr 13, 2025 am 12:17 AM

Redis的關鍵特性包括速度、靈活性和豐富的數據結構支持。 1)速度:Redis作為內存數據庫,讀寫操作幾乎瞬時,適用於緩存和會話管理。 2)靈活性:支持多種數據結構,如字符串、列表、集合等,適用於復雜數據處理。 3)數據結構支持:提供字符串、列表、集合、哈希表等,適合不同業務需求。

REDIS:確定其主要功能REDIS:確定其主要功能Apr 12, 2025 am 12:01 AM

Redis的核心功能是高性能的內存數據存儲和處理系統。 1)高速數據訪問:Redis將數據存儲在內存中,提供微秒級別的讀寫速度。 2)豐富的數據結構:支持字符串、列表、集合等,適應多種應用場景。 3)持久化:通過RDB和AOF方式將數據持久化到磁盤。 4)發布訂閱:可用於消息隊列或實時通信系統。

REDIS:流行數據結構指南REDIS:流行數據結構指南Apr 11, 2025 am 12:04 AM

Redis支持多種數據結構,具體包括:1.字符串(String),適合存儲單一值數據;2.列表(List),適用於隊列和棧;3.集合(Set),用於存儲不重複數據;4.有序集合(SortedSet),適用於排行榜和優先級隊列;5.哈希表(Hash),適合存儲對像或結構化數據。

redis計數器怎麼實現redis計數器怎麼實現Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

redis命令行怎麼用redis命令行怎麼用Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具