1. 程式人生 > >Redis的記憶體上限和記憶體回收策略

Redis的記憶體上限和記憶體回收策略

上一篇文章講到了Redis的記憶體分配和簡單的Redis記憶體檢視,今天這篇文章帶來Redis的記憶體上限管理和Redis的記憶體回收策略。

記憶體上限

Redis可以通過 maxmemory 引數來限制最大可用記憶體,主要為了避免Redis記憶體超過作業系統記憶體,從而導致伺服器響應變慢甚至宕機的情況。

maxmemory 引數限制的是Redis的物件記憶體大小,也就是 used_memory 對應的記憶體大小。由於記憶體碎片的存在,所以Redis伺服器實際佔用的記憶體是要超過 maxmemory 的。

所以我們在設定Redis記憶體上限的時候要預留一部分記憶體出來,比如說一臺32GB記憶體的機器,可以啟動 3 臺8GB記憶體的Redis,預留8GB給機器其他程序、記憶體碎片、fork子程序等。

可以通過 config set maxmemory 命令來動態修改Redis記憶體上限:

192.168.1.4>config set maxmemory 2GB
"OK"

記憶體回收策略

Redis的記憶體回收策略主要體現在兩個方面:
- 刪除到達過期時間的鍵物件
- 記憶體達到 maxmemory 後的淘汰機制

刪除過期鍵物件

由於Redis程序內儲存了大量的鍵,維護每個鍵的過期時間去刪除鍵會消耗大量的CPU資源,對於單執行緒的Redis來說成本很高。所以Redis採用惰性刪除 + 定時任務刪除機制來實現過期鍵的記憶體回收。

  • 惰性刪除:當客戶端讀取鍵時,如果鍵帶有過期時間並且已經過期,那麼會執行刪除操作並且查詢命令返回空。這種機制是為了節約CPU成本,不需要單獨維護一個TTL連結串列來處理過期的鍵。但是這種刪除機制會導致記憶體不能及時得到釋放,所以將結合下面的定時任務刪除機制一起使用。
  • 定時任務刪除:Redis內部維護一個定時任務,用於隨機獲取一些帶有過期屬性的鍵,並將其中過期的鍵刪除。來刪除一些過期的冷資料。

在兼顧CPU和記憶體的的考慮下,Redis使用惰性刪除 + 定時任務刪除機制相結合,來刪除過期鍵物件。

淘汰機制

當Redis所使用的記憶體達到 maxmemory 之後會觸發相應的溢位控制策略,Redis支援 6 種策略:
- noeviction:當記憶體使用達到閾值的時候,所有引起申請記憶體的命令會報錯。
- allkeys-lru:在所有鍵中採用lru演算法刪除鍵,直到騰出足夠記憶體為止。
- volatile-lru:在設定了過期時間的鍵中採用lru演算法刪除鍵,直到騰出足夠記憶體為止。
- allkeys-random:在所有鍵中採用隨機刪除鍵,直到騰出足夠記憶體為止。
- volatile-random:在設定了過期時間的鍵中隨機刪除鍵,直到騰出足夠記憶體為止。
- volatile-ttl:在設定了過期時間的鍵空間中,具有更早過期時間的key優先移除。

lru是Least Recently Used的縮寫,即最近最少使用。

記憶體的溢位控制策略可以採用 config set maxmemory-policy {policy} 命令來動態配置:

192.168.1.4>config set maxmemory-policy volatile-lru
"OK"

頻繁執行回收記憶體成本很高,每次都要去查詢可回收鍵和刪除鍵,所以合理設定Redis的 maxmenory 很重要,不合理的Redis溢位控制策略可能會導致一些不可預知的問題。

喜歡這篇文章的朋友,歡迎掃描下圖關注公眾號lebronchen,第一時間收到更新內容。
這裡寫圖片描述