Redis實戰 內存淘汰機制


http://blog.720ui.com/2016/redis_action_02_maxmemory_policy/#volatile-lru

文章目錄

  1. 1. 如何配置
  2. 2. 動態改配置命令
    1. 2.1. 設置最大內存
    2. 2.2. 設置淘汰策略
  3. 3. 內存淘汰策略
    1. 3.1. volatile-lru
    2. 3.2. volatile-ttl
    3. 3.3. volatile-random
    4. 3.4. allkeys-lru
    5. 3.5. allkeys-random
    6. 3.6. no-enviction
  4. 4. 如何選擇淘汰策略

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策略從而更有效率的使用內存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM