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

来源:https://www.cnblogs.com/wgjava/p/18427219
-Advertisement-
Play Games

大家好,我是 V 哥,粉絲小A面試阿裡,說被問到 Redis 的記憶體淘汰策略的問題,整理這個筆記給他參考,也分享給大家,如果你遇到這個問題,會怎麼回答呢? Redis 的記憶體淘汰策略是指當Redis的記憶體使用量達到設定的上限時,決定哪些數據應該被移除以便為新數據騰出空間的規則。Redis 提供了多種 ...


大家好,我是 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 哥整理的筆記,分享給你,歡迎關註威哥愛編程,專註技術學習與成長,絕不躺平。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 微服務 1.1. 微服務的起源可以追溯到2008年左右 1.1.1. 在Amazon,​“兩個比薩原則”成為一個單系統組件團隊規模的管理原則,後來被稱為微服務 1.1.1.1. 每個內部團隊都應該小到可以用兩個比薩餅喂飽 1.1.2. Amazon和Netflix是微服務架構的先驅,他們在20 ...
  • 1. 無伺服器的魅力 1.1. 對於某些應用程式,負載在工作時間可能很高,而在非工作時間可能很低或者不存在 1.2. 其他應用程式後臺流量可能在99%的時間里都很低 1.2.1. 一旦到了一些大型節目的門票發佈時間,負載需求可能會在數小時內飆升至平均水平的10000倍,然後回落至正常水平 1.3.  ...
  • 1. 非同步消息傳遞 1.1. 通信是分散式系統的基礎,也是架構師需要納入其系統設計的主要問題 1.2. 客戶端發送請求並等待伺服器響應 1.2.1. 這就是大多數分散式通信的設計方式,因為客戶端需要得到即時響應後才能繼續 1.2.2. 並非所有系統都有這個要求 1.3. 使用非同步通信的方式,客戶端( ...
  • 在Python中,協議(Protocol)和介面(Interface)是用於定義類和對象之間交互的一種方式,特別是在實現多態性和代碼可重用性時,協議是一種抽象概念,描述了對象所需實現的方法和屬性,而不關心具體的類或實現。 ...
  • JMM記憶體模型 定義 java記憶體模型(即 java Memory Model,簡稱JMM),不存在的東西,是一個概念,約定 主要分成兩部分來看,一部分叫做主記憶體,另一部分叫做工作記憶體。 java當中的共用變數;都放在主記憶體當中,如類的成員變數(實例變數),還有靜態的成員變數(類變數),都是存儲在主 ...
  • 1. 什麼是gprof? 2. gprof的用法 2.1. 編譯程式 2.2. 運行程式 2.3. 生成分析報告 2.4. gprof常用參數說明 2.5. 分析報告解讀 2.5.1. Flat profile 各個欄位的含義 2.5.2. Call graph 各個欄位的含義 3. Demo演示 ...
  • 一、基礎階段 Python 基礎語法 學習內容:變數、數據類型(如整數、浮點數、字元串、布爾等)、運算符、控制流語句(如 if-else、for、while 等)、函數定義與調用等。 學習網站及網址: 廖雪峰的 Python 入門教程:https://www.liaoxuefeng.com/wiki ...
  • 動態代理的API Proxy 動態代理類 生成代理對象:Proxy.newProxyInstance( 類載入器,介面數組,處理器 ) 類載入器:對象.getClass( ).getClassLoader( ) 介面數組-被代理類的所有介面:被代理對象.getClass( ).getInterfac ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...