首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Redis LRU 快取淘汰機制深度解析:從 maxmemory 策略到近似演算法

     編輯:DB2 教學

Redis 快取淘汰策略概覽

當 Redis 作為快取使用時,自動淘汰舊數據以騰出空間是常見需求,這也是 memcached 的預設行為。LRU(最近最少使用)僅是 Redis 支援的多種淘汰策略之一。本文詳細說明 maxmemory 指令限制記憶體上限,並深入剖析 Redis 採用的近似 LRU 演算法。

maxmemory 配置指令

maxmemory 用於設定 Redis 數據集佔用的記憶體上限,可在 redis.conf 中配置或運行時透過 CONFIG SET 動態調整。例如:

maxmemory 100mb

設為 0 表示不限制(64 位系統預設),32 位系統隱性限制 3 GB。達到上限時,Redis 依據 淘汰策略 選擇:回報錯誤或淘汰舊數據。

六大淘汰策略 (Eviction Policies)

透過 maxmemory-policy 指定:

  • noeviction:達到上限且客戶端嘗試寫入時返回錯誤(預設)。
  • allkeys-lru:從所有鍵中淘汰最近最少使用者,為新數據騰出空間。
  • volatile-lru:僅從設定過期時間的鍵中淘汰 LRU。
  • allkeys-random:隨機淘汰任意鍵。
  • volatile-random:隨機淘汰有過期時間的鍵。
  • volatile-ttl:淘汰過期時間最短(TTL 最小)的鍵。

volatile-* 策略若無符合條件鍵則退化為 noeviction。選擇策略需依應用存取模式,運行中可動態調整並透過 INFO 監控命中率。

經驗法則:
• 請求符合冪律分布(熱點數據集中)→ allkeys-lru
• 循環掃描或均勻分布 → allkeys-random
• 欲透過 TTL 提示淘汰優先級 → volatile-ttl
• 單實例兼顧快取與持久鍵 → allkeys-lru 或 volatile-random(但建議拆分兩實例)
• allkeys-lru 無需設定過期時間,記憶體效率更高

淘汰流程運作方式

  1. 客戶端執行寫入命令,記憶體佔用增加。
  2. Redis 檢測記憶體,若超過 maxmemory,依策略淘汰鍵。
  3. 命令執行完成,循環往複。

大型命令(如巨大集合運算)可能短暫大幅超出限制。

近似 LRU 演算法

Redis 並非精確實作 LRU(需額外記憶體維護完整存取順序),而是採用隨機取樣:每次淘汰從帶過期時間的鍵中隨機抽樣 maxmemory-samples 個(預設 5),淘汰其中最舊者。Redis 3.0 引入「候選池」機制,進一步提升近似精度。

取樣數可透過 CONFIG SET maxmemory-samples <count> 調整(如設 10 更接近真實 LRU,但增加 CPU 開銷)。實測顯示,冪律存取模式下近似與真實 LRU 差異極小。

Redis LRU vs 真實 LRU 對比圖

圖中淺灰帶=被淘汰對象,灰帶=保留舊對象,綠帶=新加入對象。Redis 3.0 在樣本數 10 時表現極接近理論值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved