【虹科乾貨】Redis 開發者需要了解的快取驅逐策略

虹科雲科技發表於2023-10-11

在你 搭建並配置了一個Redis資料庫 之後 Redis成功地 提升了應用程式效能 。然而 這裡有一個潛在問題, 隨著快取資料的快速增加和記憶體佔用率的逐漸上升, 很快會發現Redis快取 容量即將達到硬體儲存容量上限 。或許 你曾 聽說 過快取驅逐 來解決這個問題 ,但 究竟是怎麼一回事呢?

無論 是在新興企業中擔任開發人員,還是在大型企業中擔任系統管理員,瞭解快取驅逐策略,並瞭解何時以及如何 使用 ,都至關重要。 在本文中 ,我們將深入探討這些細節,讓 對快取驅逐有更清晰的認識。


一、對 快取驅逐的理解

Redis或任何依賴快取的系統 中, 快取驅逐策略都至關重要。它是解決快取空間大小和記憶體佔用問題的關鍵。當快取 資料 達到 硬體容量上限 時,快取系統必須做出決策:是拒絕接收新的資料,還是透過丟棄舊的資料為新資料騰出空間?

此時,快取驅逐就發揮作用了。 為了保持效能和資料一致性,在 快取達到上限 時,快取系統需要進行一系列判斷,以確定應該保留哪些快取 資料 ,或者需要丟棄哪些快取 資料

快取驅逐是指從快取中刪除特定資料的過程。 當快取達到 硬體 最大儲存容量時,必須刪除一些資料,為新資料騰出空間。

二、 快取驅逐策略

快取驅逐策略是 一種協議,它解決的問題是當 快取 達到上限 時,快取系統需要如何應對。不同的策略對應不同的程式 實現,用於確定應該驅逐(即刪除)哪些舊資料。以下是一些常見的策略。

·  最近最少使用(Least Recently Used ,  LRU) :想象一下,您正在整理衣櫃,您會優先扔掉哪些物品? 是學生時代遺留的格子襯衫,還是近期購入的一頂鴨舌帽? LRU快取驅逐策略會首先 刪除近期 被訪問 次數 最少的快取 資料 。其基本假設是不經常被訪問的 資料 在短期內不會再次被訪問。

·  最不頻繁使用(Least Frequently Used, LFU) :假設 是一名圖書管理員, 將如何選擇要從圖書館書架上移除的書籍?很可能是那些被借閱次數最少的書籍 這也是LFU快取驅逐策略的思想。 LFU策略會優先驅逐最不經常被訪問的快取 資料, 其基本假設是 近期不再需要這些 專案。

·  Window TinyLFU(W-TinyLFU) :這個策略稍微複雜一些。想象一下, 是一名電臺DJ, 希望播放那些受歡迎且最近熱門的歌曲。 W-TinyLFU快取驅逐策略根據資料的新舊程度和訪問頻率 判斷資料的價值,從而將最有價值的資料 保留在快取中。W-TinyLFU在處理多變的訪問模式和分散式快取環境時尤為有效。

·  生存時間(Time to Live, TTL) :想象一下, 冰箱裡 有一盒新鮮的 聖女果 ,如果在冰箱裡放太久,就會開始變質。此時,不管 有多喜歡它們,都應該將它們扔掉。 TTL在快取中有類似的概念。每個快取 資料 都有一個特定的 “過期時間”。一旦達到該時間限制,無論訪問頻率或最近訪問次數如何, 資料 都會被驅逐。這種策略可以確保 過時的資料被及時清除 。它適用於需要定期更新資料,並確保快取不提供舊 資料 的情況。

策略的有效性取決於具體的使用情況,沒有一種策略適用於所有場景。在選擇和 使用 快取驅逐策略時,需要仔細考慮應用程式的特定需求和資料訪問模式。

三、採用預設設定的風險

Redis中,預設的驅逐策略是易失性LRU(volatile-LRU)。但僅僅依賴預設策略而不瞭解其潛在影響 ,就 可能存在一定風險。應用程式服務於多樣化的使用者需求,資料模式和 資料 驅逐要求可能存在巨大差異。 透過正確設定驅逐策略可以預防潛在的問題。

1、第一道防線:監控

首先,我們需要監控快取效能以確認何時需要進行驅逐操作。我們透過監控工具達成這一目的。

Redis中,可以透過 INFO命令 來監控快取效能, 也可以 使用 第三方監控工具 提供更詳細的效能分析。

最佳化快取效能涉及兩個方面,需要根據監控效能時所發現的資訊,對快取設定和快取驅逐策略進行調整。分散式快取場景中,監控與調優在確保跨多節點一致、快取 高效管理時尤為重要。

2、選擇合適的Redis驅逐策略

Redis中,快取由maxmemory配置指令進行管理,該指令用於設定記憶體限制。而maxmemory-policy配置指令則根據所選擇的快取驅逐策略來指導Redis進行驅逐決策。這些配置項都儲存在redis.conf配置檔案中。

Redis提供了多種驅逐策略,但以下幾種可能是 最關心的策略。

(1)  allkeys-lru

Redis的allkeys-lru策略用於刪除最近最少使用的快取 資料 ,且無論是否設定了過期時間。

·  這個策略中,Redis會額外記錄每個鍵的最後訪問時間。每次讀取或寫入鍵時,Redis會更新這個資訊。

·  Redis達到記憶體限制並且需要驅逐 資料 時,它會尋找最長時間未被訪問的鍵,也就是"最近最少使用"的鍵。

·  接著,Redis會刪除這些鍵,為新的資料騰出可用的空間。

allkeys-lru策略適用於Redis資料庫中的所有鍵,無論是否設定了過期時間。與volatile-lru策略不同的是,後者僅適用於設定了過期時間的鍵。

(2)  volatile-lru

volatile-lru策略用於刪除設定了過期時間的最近最少使用的快取 資料 。這個策略適用於那些需要定期重新整理資料的場景。

(3)  allkeys-lfu

allkeys-lfu策略會刪除使用頻率最低的鍵。

·  在這個策略中,Redis會記錄每個鍵的訪問頻率。每次讀取或寫入鍵時,Redis會更新與鍵相關聯的計數器。

·  Redis達到記憶體限制時,它會尋找具有最低 訪問頻率 的鍵

·  然後,Redis會刪除這些鍵,為新的資料騰出可用的空間。

(4)  volatile-lfu

allkeys-lfu類似,volatile-lfu策略僅適用於設定了過期時間的鍵。 且按訪問頻率評判鍵的價值,當快取達到上限時,刪除訪問頻率最低的鍵。

(5)  volatile-ttl

volatile-ttl策略優先刪除具有最短TTL的鍵。

·  這個策略中,Redis會記錄每個鍵的TTL,即鍵的生存時間。TTL是一個持續時間,在到期之後,鍵將自動刪除。

·  Redis達到記憶體限制時,它會尋找具有最短TTL的鍵,也就是即將過期的鍵。

·  Redis會刪除這些鍵,為新的資料騰出可用的空間。

(6)  noeviction

顧名思義, noeviction策略是當Redis達到記憶體限制並收到寫入命令時,不會驅逐任何鍵,而是返回錯誤。

·  Redis達到記憶體限制並且收到寫入命令時,它會檢查驅逐策略。

·  如果策略設定為noeviction,則Redis不會驅逐任何鍵,而是向寫入命令返回錯誤。

·  在這種情況下,應用程式程式碼需要確定如何處理該錯誤條件。

 

事實上,以上 每種策略都 有其優缺點,最適合的策略 需要依 具體業務需求 而定

當處理大量資料時,使用良好結構的快取,並結合適當的快取驅逐策略,可以更好地 保持 快取的效能。Redis以其豐富的功能成為優秀的快取解決方案,併為處理大型資料集的應用程式提供了強大的支援。有效的快取管理不僅能透過快取命中加快資料檢索,還能減輕快取未命中的影響,使得Redis成為各種用例中可靠且高效的快取解決方案。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026953/viewspace-2988158/,如需轉載,請註明出處,否則將追究法律責任。

相關文章