當前Redis3.0版本支持的淘汰策略有6種:redis
1. volatile-lru:從設置過時時間的數據集(server.db[i].expires)中挑選出最近最少使用的數據淘汰。沒有設置過時時間的key不會被淘汰,這樣就能夠在增長內存空間的同時保證須要持久化的數據不會丟失。算法
2. volatile-ttl:除了淘汰機制採用LRU,策略基本上與volatile-lru類似,從設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰,ttl值越大越優先被淘汰。緩存
3. volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰。當內存達到限制沒法寫入非過時時間的數據集時,能夠經過該淘汰策略在主鍵空間中隨機移除某個key。服務器
4. allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰,該策略要淘汰的key面向的是全體key集合,而非過時的key集合。數據結構
5. allkeys-random:從數據集(server.db[i].dict)中選擇任意數據淘汰。dom
6. no-enviction:禁止驅逐數據,也就是當內存不足以容納新入數據時,新寫入操做就會報錯,請求能夠繼續進行,線上任務也不能持續進行,採用no-enviction策略能夠保證數據不被丟失,這也是系統默認的一種淘汰策略。函數
上述是Redis的6種淘汰策略,關於使用這6種策略,開發者還須要根據自身系統特徵,正確選擇或修改驅逐。性能
Redis緩存功能,是由edis.c文件中的freeMemoryIfNeeded函數實現的。若是maxmemory被設置,那麼每次在執行命令錢,該函數都會被調用來判斷內存是否夠用、釋放內存、返回錯誤。若是沒有足夠的內存程序主邏輯將會阻止設置了REDIS_COM_DENYOOM flag的命令執行,對其返回command not allowed when used memory > ‘maxmemory’的錯誤消息。unix
區分不一樣的淘汰策略選擇不一樣的key,Redis淘汰策略主要分爲LRU淘汰、TTL淘汰、隨機淘汰三種機制。server
LRU淘汰
LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是「若是數據最近被訪問過,那麼未來被訪問的概率也更高」。
在服務器配置中保存了 lru 計數器 server.lrulock,會定時(redis 定時程序 serverCorn())更新,server.lrulock 的值是根據 server.unixtime 計算出來進行排序的,而後選擇最近使用時間最久的數據進行刪除。另外,從 struct redisObject 中能夠發現,每個 redis 對象都會設置相應的 lru。每一次訪問數據,會更新對應redisObject.lru。
在Redis中,LRU算法是一個近似算法,默認狀況下,Redis會隨機挑選5個鍵,並從中選擇一個最久未使用的key進行淘汰。在配置文件中,按maxmemory-samples選項進行配置,選項配置越大,消耗時間就越長,但結構也就越精準。
TTL淘汰
Redis 數據集數據結構中保存了鍵值對過時時間的表,即 redisDb.expires。與 LRU 數據淘汰機制相似,TTL 數據淘汰機制中會先從過時時間的表中隨機挑選幾個鍵值對,取出其中 ttl ***的鍵值對淘汰。一樣,TTL淘汰策略並非面向全部過時時間的表中最快過時的鍵值對,而只是隨機挑選的幾個鍵值對。
隨機淘汰
在隨機淘汰的場景下獲取待刪除的鍵值對,隨機找hash桶再次hash指定位置的dictEntry便可。
Redis中的淘汰機制都是幾近於算法實現的,主要從性能和可靠性上作平衡,因此並非徹底可靠,因此開發者們在充分了解Redis淘汰策略以後還應在平時多主動設置或更新key的expire時間,主動刪除沒有價值的數據,提高Redis總體性能和空間。