阿里面試讓聊一聊Redis 的記憶體淘汰(驅逐)策略

威哥爱编程發表於2024-09-23

大家好,我是 V 哥,粉絲小A面試阿里,說被問到 Redis 的記憶體淘汰策略的問題,整理這個筆記給他參考,也分享給大家,如果你遇到這個問題,會怎麼回答呢?

Redis 的記憶體淘汰策略是指當Redis的記憶體使用量達到設定的上限時,決定哪些資料應該被移除以便為新資料騰出空間的規則。Redis 提供了多種記憶體淘汰策略,可以透過配置檔案中的 maxmemory-policy 指令來設定。以下是 Redis 支援的主要記憶體淘汰策略:

  1. noeviction:這是預設策略,當記憶體使用達到限制時,Redis 會拒絕新的寫入操作,並返回錯誤,但不會淘汰任何資料。

  2. allkeys-lru:在所有鍵中,基於最近最少使用(LRU)演算法淘汰資料。Redis 會維護一個近似的 LRU 列表,並不保證完全精確,但是對大多數使用場景來說是足夠的。

  3. allkeys-lfu:在所有鍵中,基於最少頻率使用(LFU)演算法淘汰資料。LFU 演算法會跟蹤每個鍵的訪問頻率,並淘汰訪問頻率最低的鍵。

  4. volatile-lru:僅在設定了過期時間的鍵中,基於 LRU 演算法淘汰資料。

  5. volatile-lfu:僅在設定了過期時間的鍵中,基於 LFU 演算法淘汰資料。

  6. volatile-random:在設定了過期時間的鍵中隨機選擇淘汰。

  7. allkeys-random:在所有鍵中隨機選擇淘汰。

  8. volatile-ttl:在設定了過期時間的鍵中,淘汰那些 TTL(Time To Live)值最小的鍵,也就是即將過期的鍵。

以上是8種不同的淘汰策略,選擇哪種淘汰策略取決於具體的使用場景和業務需求。例如,如果你希望 Redis 作為快取使用,並且快取的資料大多是臨時性的,那麼可能會選擇 allkeys-lruvolatile-lru。如果你的應用中有明確的熱點資料,可能會選擇 allkeys-lfuvolatile-lfu 來確保熱點資料不會被輕易淘汰。

Redis 還提供了一些工具和命令來幫助監控和最佳化記憶體使用,例如 INFO memory 命令可以檢視記憶體使用情況,CONFIG SET maxmemory 可以動態調整記憶體上限。

在 Redis 4.0 版本後引入了 MEMORY 命令,可以更細緻地管理和分析記憶體使用情況。例如,MEMORY USAGE 可以估算鍵值對的記憶體使用量,MEMORY STATS 可以顯示記憶體使用的詳細資訊。

Redis 的記憶體淘汰是在後臺非同步進行的,因此即使達到了記憶體上限,也不會立即淘汰資料,而是在新的寫入操作發生時根據配置的策略進行淘汰。

noeviction

noeviction 是 Redis 預設的記憶體淘汰策略。當 Redis 的記憶體使用量達到 maxmemory 配置的限制時,如果嘗試執行可能導致更多記憶體使用的命令(如 SET、LPUSH、SADD 等),Redis 將返回錯誤,而不是淘汰任何現有的鍵值對。

在以下應用場景中可以使用

  1. 資料保留:如果你的應用場景中,每個資料項都非常重要,不能丟失,那麼 noeviction 策略可以確保即使在高記憶體使用的情況下,資料也不會被自動淘汰。

  2. 記憶體充足的環境:如果你的伺服器有足夠的記憶體,或者 Redis 例項被限制在一個相對較小的資料集上,那麼使用 noeviction 策略可以避免複雜的淘汰邏輯,簡化記憶體管理。

  3. 訊息佇列:在某些使用 Redis 作為訊息佇列的場景中,可能會希望確保所有訊息都能被處理,而不是在記憶體壓力下丟失訊息。

  4. 快取預熱:在快取預熱階段,可能會希望保持快取資料的完整性,直到快取穩定後再根據實際訪問模式進行淘汰。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy noeviction 來啟用 noeviction 策略。
   maxmemory-policy noeviction
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy noeviction
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy noeviction

小結一下

  • 當設定為 noeviction 時,Redis 會記錄記憶體使用量,但不會主動淘汰任何鍵值對。
  • 如果記憶體使用量達到限制,Redis 會拒絕那些可能會增加記憶體使用的命令,並返回錯誤資訊,如 (error)OOM command not allowed when used memory>'maxmemory'
  • 這種策略下,只有當客戶端顯式地刪除鍵值對或鍵值對過期時,記憶體才會被釋放。
  • 由於不自動淘汰資料,使用 noeviction 策略時需要更加謹慎地監控記憶體使用情況,並確保有足夠的記憶體空間來處理資料的增長。

敲黑板啦,注意事項

  • 使用 noeviction 策略時,需要確保伺服器有足夠的記憶體來處理資料的增長,否則 Redis 可能會因為記憶體不足而無法處理新的寫入請求。
  • 在某些情況下,如果 Redis 長時間無法處理寫入請求,可能會導致客戶端操作超時或錯誤,影響應用程式的正常執行。
  • 如果你的應用可以容忍資料的丟失,或者有其他機制來處理資料淘汰(如定期清理舊資料),那麼可以考慮使用其他淘汰策略來更有效地管理記憶體。

allkeys-lru

allkeys-lru 是 Redis 的一種記憶體淘汰策略,全稱為 "all keys least recently used"。這種策略會在所有鍵中,包括那些沒有設定過期時間的鍵,基於最近最少使用演算法(LRU)來淘汰資料。

適合的應用場景

  1. 快取應用:在快取場景中,通常需要保留最近被訪問的資料,以便快速響應後續的讀取請求。allkeys-lru 策略可以確保快取中的資料是最近被訪問的,從而提高快取效率。

  2. 資料訪問模式均勻:如果你的應用中所有資料的訪問模式相對均勻,沒有特別明顯的熱點資料,那麼 allkeys-lru 可以作為一個合理的選擇,因為它會淘汰最不活躍的資料。

  3. 資料替換:在某些應用中,可能需要定期替換舊資料以保持資料的新鮮度,allkeys-lru 策略可以幫助實現這一點。

  4. 記憶體限制嚴格:在記憶體使用有嚴格限制的環境中,allkeys-lru 可以作為一種自動的資料淘汰機制,以確保記憶體使用不會超過設定的限制。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy allkeys-lru 來啟用 allkeys-lru 策略。
maxmemory-policy allkeys-lru
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy allkeys-lru

小結一下

  • LRU 演算法:最近最少使用(LRU)是一種常見的頁面置換演算法,它基於這樣一個假設:如果資料最近被訪問過,那麼將來被訪問的機率也更高。LRU 演算法會跟蹤每個資料項的訪問時間,並在需要淘汰資料時選擇最久未被訪問的資料。

  • 淘汰過程:當 Redis 的記憶體使用量達到 maxmemory 限制時,Redis 會根據 LRU 演算法淘汰最久未被訪問的鍵值對,直到記憶體使用量降到限制以下。

  • 近似實現:Redis 實現的 LRU 演算法是一個近似版本,它透過定期檢查一組隨機鍵,並淘汰其中最久未被訪問的鍵來工作。這樣可以在不犧牲太多效能的情況下,近似地實現 LRU 演算法。

  • 配置樣本大小:Redis 允許你透過 maxmemory-samples 配置來調整用於淘汰決策的鍵樣本大小。增加樣本大小可以提高淘汰決策的準確性,但可能會增加 CPU 的使用率。

敲黑板:注意的地方

  • 資料丟失:使用 allkeys-lru 策略時,需要意識到一些最近沒有被訪問的資料可能會被自動淘汰,這可能導致資料丟失。

  • 效能考慮:雖然 LRU 演算法可以提高快取命中率,但 Redis 需要維護額外的訪問時間資訊,這可能會對效能產生一定影響。

  • 監控:建議監控 Redis 的記憶體使用情況和淘汰事件,以確保系統按預期工作,並及時調整策略或增加記憶體資源。

  • 業務適配:在決定使用 allkeys-lru 策略之前,應考慮業務需求和資料訪問模式,確保該策略與業務目標一致。

allkeys-lfu

allkeys-lfu 是 Redis 的一種記憶體淘汰策略,全稱為 "all keys least frequently used"。這種策略會在所有鍵中,包括那些沒有設定過期時間的鍵,基於最少頻率使用演算法(LFU)來淘汰資料。

適合用的應用場景

  1. 訪問模式不均勻:在資料訪問模式不均勻的情況下,某些鍵可能被頻繁訪問,而另一些鍵則很少被訪問。allkeys-lfu 策略可以確保經常訪問的鍵不會被輕易淘汰。

  2. 熱點資料保留:如果你的應用中有熱點資料,即那些被頻繁訪問的資料,使用 allkeys-lfu 策略可以確保這些熱點資料不會因為最近最少使用演算法而被誤淘汰。

  3. 資料重要性:在某些應用中,資料的重要性與其被訪問的頻率成正比。使用 allkeys-lfu 策略可以保留那些被認為更重要的資料。

  4. 避免資料抖動:在一些實時性要求高的應用中,如推薦系統或實時分析系統,使用 allkeys-lfu 策略可以減少因為資料被淘汰而導致的抖動。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy allkeys-lfu 來啟用 allkeys-lfu 策略。
   maxmemory-policy allkeys-lfu
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lfu
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy allkeys-lfu

小結一下

  • LFU 演算法:最少頻率使用(LFU)是一種頁面置換演算法,它基於資料項的訪問頻率來淘汰資料。LFU 演算法會跟蹤每個資料項的訪問次數,並在需要淘汰資料時選擇訪問次數最少的資料。

  • 淘汰過程:當 Redis 的記憶體使用量達到 maxmemory 限制時,Redis 會根據 LFU 演算法淘汰訪問次數最少的鍵值對,直到記憶體使用量降到限制以下。

  • 近似實現:Redis 實現的 LFU 演算法是一個近似版本,它透過維護一個計數器來跟蹤每個鍵的訪問頻率,並在需要淘汰資料時選擇訪問頻率最低的鍵。

  • 配置頻率衰減:Redis 允許透過 lfu-decay-time 配置項來設定訪問頻率的衰減時間,這有助於平衡最近訪問頻率和長期訪問頻率的重要性。

敲黑板:注意事項

  • 資料淘汰:使用 allkeys-lfu 策略時,需要意識到那些訪問頻率較低的資料可能會被自動淘汰,這可能導致某些資料的丟失。

  • 效能考慮:雖然 LFU 演算法可以保留重要的熱點資料,但 Redis 需要維護額外的訪問計數器,這可能會對效能產生一定影響。

  • 監控:建議監控 Redis 的記憶體使用情況和淘汰事件,以確保系統按預期工作,並及時調整策略或增加記憶體資源。

  • 業務適配:在決定使用 allkeys-lfu 策略之前,應考慮業務需求和資料訪問模式,確保該策略與業務目標一致。

  • 演算法精度:Redis 的 LFU 實現是一個近似演算法,它透過定期檢查一組隨機鍵,並淘汰其中訪問頻率最低的鍵來工作。這樣可以在不犧牲太多效能的情況下,近似地實現 LFU 演算法。

volatile-lru

volatile-lru 是 Redis 的一種記憶體淘汰策略,全稱為 "volatile keys least recently used"。這種策略僅針對設定了過期時間的鍵,基於最近最少使用演算法(LRU)來淘汰資料。

適合的應用場景

  1. 快取與過期資料:在快取資料時,通常會為快取項設定一個過期時間。volatile-lru 策略可以確保在記憶體不足時,最近最少被使用的過期鍵首先被移除。

  2. 臨時資料儲存:對於需要臨時儲存的資料,如會話資訊或臨時計算結果,這些資料通常有明確的過期時間。使用 volatile-lru 策略可以有效地管理這些臨時資料。

  3. 熱點資料保護:如果你希望保護那些沒有設定過期時間的熱點資料不被誤淘汰,volatile-lru 策略可以確保只有那些即將過期的資料才會被考慮淘汰。

  4. 資料時效性:在資料具有較強時效性的場景中,如新聞文章或實時資料,使用 volatile-lru 策略可以確保舊資料在記憶體不足時被優先淘汰。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy volatile-lru 來啟用 volatile-lru 策略。
   maxmemory-policy volatile-lru
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-lru
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy volatile-lru

小結一下

  • LRU 演算法:最近最少使用(LRU)是一種常見的頁面置換演算法,它基於這樣一個假設:如果資料最近被訪問過,那麼將來被訪問的機率也更高。LRU 演算法會跟蹤每個資料項的訪問時間,並在需要淘汰資料時選擇最久未被訪問的資料。

  • 淘汰過程:當 Redis 的記憶體使用量達到 maxmemory 限制時,Redis 會根據 LRU 演算法淘汰最久未被訪問的設定了過期時間的鍵值對,直到記憶體使用量降到限制以下。

  • 近似實現:Redis 實現的 LRU 演算法是一個近似版本,它透過定期檢查一組隨機鍵,並淘汰其中最久未被訪問的鍵來工作。這樣可以在不犧牲太多效能的情況下,近似地實現 LRU 演算法。

  • 配置樣本大小:Redis 允許你透過 maxmemory-samples 配置來調整用於淘汰決策的鍵樣本大小。增加樣本大小可以提高淘汰決策的準確性,但可能會增加 CPU 的使用率。

duangduangduang 注意一下

  • 資料淘汰:使用 volatile-lru 策略時,需要意識到那些最近沒有被訪問且即將過期的資料可能會被自動淘汰,這可能導致資料丟失。

  • 效能考慮:雖然 LRU 演算法可以提高快取命中率,但 Redis 需要維護額外的訪問時間資訊,這可能會對效能產生一定影響。

  • 監控:建議監控 Redis 的記憶體使用情況和淘汰事件,以確保系統按預期工作,並及時調整策略或增加記憶體資源。

  • 業務適配:在決定使用 volatile-lru 策略之前,應考慮業務需求和資料訪問模式,確保該策略與業務目標一致。

  • 資料保護:如果你的應用中有重要的資料沒有設定過期時間,需要注意 volatile-lru 策略不會淘汰這些資料,從而可以保護這些資料不被誤淘汰。

volatile-lfu

volatile-lfu 是 Redis 的一種記憶體淘汰策略,全稱為 "volatile keys least frequently used"。這種策略僅針對設定了過期時間的鍵,基於最少頻率使用演算法(LFU)來淘汰資料。

適合的應用場景

  1. 快取與頻率限制:在快取資料時,如果某些資料項被訪問的頻率非常低,即使它們最近被訪問過,也可能不是很重要。volatile-lfu 策略可以確保這些不常訪問的鍵被優先淘汰。

  2. 臨時資料儲存:對於有明確過期時間的臨時資料,如使用者會話或快取的API響應,volatile-lfu 策略可以在記憶體不足時,根據訪問頻率來淘汰這些臨時資料。

  3. 資料時效性與訪問頻率:在資料具有較強時效性且訪問頻率不均勻的場景中,volatile-lfu 策略可以結合時效性和訪問頻率來決定資料的保留優先順序。

  4. 熱點資料與臨時資料的平衡:如果你希望保護那些頻繁訪問的臨時資料不被輕易淘汰,同時淘汰那些不常訪問的臨時資料,volatile-lfu 策略可以實現這種平衡。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy volatile-lfu 來啟用 volatile-lfu 策略。
   maxmemory-policy volatile-lfu
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-lfu
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy volatile-lfu

小結一下

  • LFU 演算法:最少頻率使用(LFU)是一種頁面置換演算法,它基於資料項的訪問頻率來淘汰資料。LFU 演算法會跟蹤每個資料項的訪問次數,並在需要淘汰資料時選擇訪問次數最少的資料。

  • 淘汰過程:當 Redis 的記憶體使用量達到 maxmemory 限制時,Redis 會根據 LFU 演算法淘汰設定了過期時間但訪問次數最少的鍵值對,直到記憶體使用量降到限制以下。

  • 近似實現:Redis 實現的 LFU 演算法是一個近似版本,它透過維護一個計數器來跟蹤每個鍵的訪問頻率,並在需要淘汰資料時選擇訪問頻率最低的鍵。

  • 配置頻率衰減:Redis 允許透過 lfu-decay-time 配置項來設定訪問頻率的衰減時間,這有助於平衡最近訪問頻率和長期訪問頻率的重要性。

注意 注意

  • 資料淘汰:使用 volatile-lfu 策略時,需要意識到那些訪問頻率較低且即將過期的資料可能會被自動淘汰,這可能導致資料丟失。

  • 效能考慮:雖然 LFU 演算法可以保留重要的熱點資料,但 Redis 需要維護額外的訪問計數器,這可能會對效能產生一定影響。

  • 監控:建議監控 Redis 的記憶體使用情況和淘汰事件,以確保系統按預期工作,並及時調整策略或增加記憶體資源。

  • 業務適配:在決定使用 volatile-lfu 策略之前,應考慮業務需求和資料訪問模式,確保該策略與業務目標一致。

  • 演算法精度:Redis 的 LFU 實現是一個近似演算法,它透過定期檢查一組隨機鍵,並淘汰其中訪問頻率最低的鍵來工作。這樣可以在不犧牲太多效能的情況下,近似地實現 LFU 演算法。

volatile-random

volatile-random 是 Redis 的一種記憶體淘汰策略,全稱為 "volatile keys random"。這種策略僅針對設定了過期時間的鍵,隨機淘汰資料。

適合的應用場景

  1. 過期資料的不確定性:當你希望在記憶體不足時隨機淘汰一些即將過期的資料,而不是基於訪問模式或頻率時,volatile-random 是一個合適的選擇。

  2. 簡化的淘汰邏輯:如果你不需要複雜的淘汰邏輯,而只是希望在記憶體壓力下隨機釋放一些空間,那麼 volatile-random 策略可以滿足需求。

  3. 臨時資料儲存:對於儲存臨時資料的場景,如快取的會話資訊或臨時計算結果,如果這些資料的丟失不會對系統造成重大影響,可以使用 volatile-random 策略。

  4. 避免熱點資料誤傷:如果你希望避免基於訪問模式淘汰資料,從而可能誤傷熱點資料,volatile-random 策略可以提供一個更為“公平”的淘汰機制。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy volatile-random 來啟用 volatile-random 策略。
   maxmemory-policy volatile-random
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-random
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy volatile-random

小結一下

  • 隨機淘汰volatile-random 策略會在達到記憶體限制時,從所有設定了過期時間的鍵中隨機選擇一些鍵進行淘汰。

  • 淘汰過程:Redis 會維護一個設定了過期時間的鍵的列表,當需要淘汰資料時,它會從這個列表中隨機選擇鍵來淘汰,直到記憶體使用量降到限制以下。

  • 簡單且快速:這種策略的實現相對簡單,不需要跟蹤每個鍵的訪問時間或頻率,因此在執行淘汰操作時可以非常快速。

  • 公平性:由於淘汰是基於隨機性的,因此這種策略在一定程度上可以認為是“公平”的,因為它不偏向於任何特定的資料。

注意

  • 資料淘汰的不確定性:使用 volatile-random 策略時,任何設定了過期時間的資料都有可能被淘汰,這可能導致一些重要的資料被意外淘汰。

  • 效能考慮:雖然隨機淘汰策略的實現簡單且快速,但頻繁的淘汰操作可能會對效能產生一定影響,尤其是在記憶體使用率較高時。

  • 監控:建議監控 Redis 的記憶體使用情況和淘汰事件,以確保系統按預期工作,並及時調整策略或增加記憶體資源。

  • 業務適配:在決定使用 volatile-random 策略之前,應考慮業務需求和資料的重要性,確保該策略與業務目標一致。

  • 資料保護:如果你的應用中有重要的資料設定了過期時間,需要注意 volatile-random 策略可能會淘汰這些資料,從而需要考慮額外的資料保護措施。

allkeys-random

allkeys-random 是 Redis 的一種記憶體淘汰策略,全稱為 "all keys random"。這種策略會在所有鍵中,無論是否設定了過期時間,隨機淘汰資料。

適合的應用場景

  1. 無差別資料:如果你的快取資料沒有明顯的訪問模式差異,即所有資料的訪問頻率和重要性都差不多,那麼 allkeys-random 可以作為一個簡單的淘汰策略。

  2. 負載均衡:在分散式快取環境中,如果所有節點的記憶體容量都接近上限,使用 allkeys-random 策略可以確保淘汰操作在各個節點之間相對均衡。

  3. 非關鍵資料:如果你快取的資料是非關鍵資料,即使部分資料被隨機淘汰也不會對業務造成顯著影響,那麼這種策略可以減少系統的複雜性。

  4. 臨時解決方案:在緊急情況下,如記憶體洩漏或其他問題導致記憶體壓力突然增大,allkeys-random 可以作為一個快速反應的淘汰策略。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy allkeys-random 來啟用 allkeys-random 策略。
   maxmemory-policy allkeys-random
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-random
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy allkeys-random

小結一下

  • 隨機淘汰allkeys-random 策略會在達到記憶體限制時,從所有鍵中隨機選擇一些鍵進行淘汰。

  • 淘汰過程:Redis 會維護一個所有鍵的列表,當需要淘汰資料時,它會從這個列表中隨機選擇鍵來淘汰,直到記憶體使用量降到限制以下。

  • 簡單且快速:這種策略的實現相對簡單,不需要跟蹤每個鍵的訪問時間或頻率,因此在執行淘汰操作時可以非常快速。

  • 公平性:由於淘汰是基於隨機性的,因此這種策略在一定程度上可以認為是“公平”的,因為它不偏向於任何特定的資料。

注意一下

  • 資料淘汰的不確定性:使用 allkeys-random 策略時,任何資料都有可能被淘汰,這可能導致一些重要的資料被意外淘汰。

  • 效能考慮:雖然隨機淘汰策略的實現簡單且快速,但頻繁的淘汰操作可能會對效能產生一定影響,尤其是在記憶體使用率較高時。

  • 監控:建議監控 Redis 的記憶體使用情況和淘汰事件,以確保系統按預期工作,並及時調整策略或增加記憶體資源。

  • 業務適配:在決定使用 allkeys-random 策略之前,應考慮業務需求和資料的重要性,確保該策略與業務目標一致。

  • 資料保護:如果你的應用中有重要的資料,需要注意 allkeys-random 策略可能會淘汰這些資料,從而需要考慮額外的資料保護措施。

volatile-ttl

volatile-ttl 是 Redis 的一種記憶體淘汰策略,全稱為 "volatile keys with the smallest Time To Live"。這種策略僅針對設定了過期時間的鍵,淘汰那些剩餘生存時間(TTL)最短的鍵。

適合的應用場景

  1. 臨時資料快取:對於那些有明確過期時間的臨時資料,如會話資訊、定時任務結果等,volatile-ttl 策略可以確保這些資料在記憶體不足時按照 TTL 順序被清除。

  2. 資料時效性管理:在資料具有較強時效性的場景中,如新聞快訊或實時報價,volatile-ttl 策略可以確保最接近過期的資料首先被移除。

  3. 過期資料優先淘汰:如果你希望在記憶體不足時優先淘汰那些即將過期的資料,而不是其他資料,volatile-ttl 提供了一種直接的方式來實現這一目標。

  4. 記憶體最佳化:在記憶體資源有限的情況下,volatile-ttl 策略可以幫助最佳化記憶體使用,確保記憶體中的資料儘可能是有用的,即將過期的資料被及時清除。

怎麼用

  1. 配置檔案設定:在 Redis 配置檔案 redis.conf 中,可以透過設定 maxmemory-policy volatile-ttl 來啟用 volatile-ttl 策略。
   maxmemory-policy volatile-ttl
  1. 執行時設定:也可以在 Redis 執行時使用 CONFIG SET 命令來動態更改記憶體淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-ttl
  1. 命令列設定:如果你使用的是 Redis 命令列工具,也可以在啟動 Redis 服務時透過命令列引數設定。
   redis-server --maxmemory-policy volatile-ttl

小結一下

  • TTL 淘汰volatile-ttl 策略會根據鍵的剩餘生存時間來淘汰資料。Redis 會跟蹤每個設定了過期時間的鍵的 TTL,並在需要淘汰資料時選擇 TTL 最短的鍵。

  • 淘汰過程:當 Redis 的記憶體使用量達到 maxmemory 限制時,Redis 會查詢所有設定了過期時間的鍵,並淘汰那些 TTL 最短的鍵,直到記憶體使用量降到限制以下。

  • 實時性:這種策略可以確保記憶體中的資料儘可能是最新的,因為它傾向於淘汰那些即將過期的資料。

  • 配置樣本大小:雖然 volatile-ttl 策略不涉及 maxmemory-samples 的配置,但它仍然需要定期檢查鍵的 TTL,以便做出淘汰決策。

要注意的情況

  • 資料淘汰的不確定性:使用 volatile-ttl 策略時,需要注意即使某些資料的 TTL 很短,它們也可能在記憶體不足時被保留,這取決於其他鍵的 TTL 值。

  • 效能考慮:雖然 TTL 淘汰策略的實現相對簡單,但頻繁的淘汰操作可能會對效能產生一定影響,尤其是在記憶體使用率較高時。

  • 監控:建議監控 Redis 的記憶體使用情況和淘汰事件,以確保系統按預期工作,並及時調整策略或增加記憶體資源。

  • 業務適配:在決定使用 volatile-ttl 策略之前,應考慮業務需求和資料的時效性,確保該策略與業務目標一致。

  • 資料保護:如果你的應用中有重要的資料設定了過期時間,需要注意 volatile-ttl 策略可能會淘汰這些資料,從而需要考慮額外的資料保護措施。

最後

以上是 V 哥整理的筆記,分享給你,歡迎關注威哥愛程式設計,專注技術學習與成長,絕不躺平。

相關文章