摘要:
Redis 在生產環境中,采用配置參數 maxmemory 的方式來限制內存的大小。當實際存儲內存超過 maxmemory 參數值時,開發者可以通過 Redis 內存淘汰策略,來決定如何騰出新空間繼續支持讀寫工作。
工作情況
首先,客戶端會發起需要更多內存的申請;其次,Redis 檢查內存使用情況,如果實際使用內存已經超出 maxmemory, Redis 會根據用戶配置的淘汰策略選出無用的 Key,執行淘汰任務。
淘汰策略
volatile-lru
從過期時間的數據集(server.db[i].expires)中挑選出最近最少使用的數據淘汰。沒有設置過期時間的 key 不會被淘汰,這樣就可以在增加內存空間的同時保證需要持久化的數據不會丟失。
volatile-ttl
除了淘汰機制不同,策略上基本與 volatile-lru 相似,從設置過期時間的數據集(server.db[i].expires) 中挑選將要過期的數據淘汰,ttl 值越小,越容易被淘汰。
volatile-random
從設置過期時間的數據集(server.db[i].expires) 中任意選擇數據淘汰。
allkeys-lru
從數據集(server.db[i].dict) 中挑選最近最少使用的數據淘汰,該策略要淘汰的 key 面向的是全體 Key 集合,而非過期的 Key 集合
allkeys-random
從數據集(server.db[i].dict)中選擇任意數據淘汰。
no-enviction
禁止驅逐數據,也就是當內存不足以容納新入數據時,新寫入操作就會報錯,采用該策略可以保證數據不被丟失,也是系統默認的一種淘汰策略。
注意:在Redis中,LRU算法是一個近似算法,默認情況下,Redis會隨機挑選5個鍵,並從中選擇一個最久未使用的key進行淘汰。在配置文件中,按maxmemory-samples選項進行配置,選項配置越大,消耗時間就越長,但結構也就越精准。
參考資料:
https://stor.51cto.com/art/201904/594773.htm
https://wiki.jikexueyuan.com/project/redis/data-elimination-mechanism.html