http://blog.720ui.com/2016/redis_action_02_maxmemory_policy/#volatile-lru
文章目錄
redis 內存數據集大小上升到一定大小的時候,就會進行數據淘汰策略。
如何配置
我們通過配置redis.conf中的maxmemory這個值來開啟內存淘汰功能。
# maxmemory
值得注意的是,maxmemory為0的時候表示我們對Redis的內存使用沒有限制。
根據應用場景,選擇淘汰策略
# maxmemory-policy noeviction
我們來了解下,內存淘汰的過程
首先,客戶端發起了需要申請更多內存的命令(如set)。
然后,Redis檢查內存使用情況,如果已使用的內存大於maxmemory則開始根據用戶配置的不同淘汰策略來淘汰內存(key),從而換取一定的內存。
最后,如果上面都沒問題,則這個命令執行成功。
動態改配置命令
此外,redis支持動態改配置,無需重啟。
設置最大內存
config set maxmemory 100000
設置淘汰策略
config set maxmemory-policy noeviction
內存淘汰策略
volatile-lru
從已設置過期時間的數據集中挑選最近最少使用的數據淘汰。redis並不是保證取得所有數據集中最近最少使用的鍵值對,而只是隨機挑選的幾個鍵值對中的, 當內存達到限制的時候無法寫入非過期時間的數據集。
volatile-ttl
從已設置過期時間的數據集中挑選將要過期的數據淘汰。redis 並不是保證取得所有數據集中最近將要過期的鍵值對,而只是隨機挑選的幾個鍵值對中的, 當內存達到限制的時候無法寫入非過期時間的數據集。
volatile-random
從已設置過期時間的數據集中任意選擇數據淘汰。當內存達到限制的時候無法寫入非過期時間的數據集。
allkeys-lru
從數據集中挑選最近最少使用的數據淘汰。當內存達到限制的時候,對所有數據集挑選最近最少使用的數據淘汰,可寫入新的數據集。
allkeys-random
從數據集中任意選擇數據淘汰,當內存達到限制的時候,對所有數據集挑選隨機淘汰,可寫入新的數據集。
no-enviction
當內存達到限制的時候,不淘汰任何數據,不可寫入任何數據集,所有引起申請內存的命令會報錯。
如何選擇淘汰策略
下面看看幾種策略的適用場景
allkeys-lru:如果我們的應用對緩存的訪問符合冪律分布,也就是存在相對熱點數據,或者我們不太清楚我們應用的緩存訪問分布狀況,我們可以選擇allkeys-lru策略。
allkeys-random:如果我們的應用對於緩存key的訪問概率相等,則可以使用這個策略。
volatile-ttl:這種策略使得我們可以向Redis提示哪些key更適合被eviction。
另外,volatile-lru策略和volatile-random策略適合我們將一個Redis實例既應用於緩存和又應用於持久化存儲的時候,然而我們也可以通過使用兩個Redis實例來達到相同的效果,值得一提的是將key設置過期時間實際上會消耗更多的內存,因此我們建議使用allkeys-lru策略從而更有效率的使用內存。