Redis 內存數據集大小上升到一定大小的時候,就會進行數據淘汰策略。
Redis 提供了 6 種數據淘汰策略:
1. volatile-lru:從已設置過期時間的數據集中挑選最近最少使用的數據淘汰。
2. volatile-ttl:從已設置過期時間的數據集中挑選將要過期的數據淘汰。
3. volatile-random:從已設置過期時間的數據集中任意選擇數據淘汰。
4. allkeys-lru:從數據集中挑選最近最少使用的數據淘汰。
5. allkeys-random:從數據集中任意選擇數據淘汰,當內存達到限制的時候,對所有數據集挑選隨機淘汰,可寫入新的數據集。
6. no-enviction:當內存達到限制的時候,不淘汰任何數據,不可寫入任何數據集,所有引起申請內存的命令會報錯。
7. allkeys-lfu 從數據集(server.db[i].dict)中挑選使用頻率最小的數據淘汰,該策略要淘汰的key面向的是全體key集合,而非過期的key集合。
8. volatile-lfu 從設置過期時間的數據集(server.db[i].expires)中挑選出使用頻率最小的數據淘汰。沒有設置過期時間的key不會被淘汰,這樣就可以在增加內存空間的同時保證需要持久化的數據不會丟失
如何配置:
我們通過配置redis.conf中的maxmemory這個值來開啟內存淘汰功能。
# maxmemory
值得注意的是,maxmemory為0的時候表示我們對Redis的內存使用沒有限制。
根據應用場景,選擇淘汰策略
# maxmemory-policy noeviction
設置最大內存
config set maxmemory 100000
設置淘汰策略
config set maxmemory-policy noeviction
三、如何選擇淘汰策略
下面看看幾種策略的適用場景
allkeys-lru:如果我們的應用對緩存的訪問符合冪律分布,也就是存在相對熱點數據,或者我們不太清楚我們應用的緩存訪問分布狀況,我們可以選擇allkeys-lru策略。
allkeys-random:如果我們的應用對於緩存key的訪問概率相等,則可以使用這個策略。
volatile-ttl:這種策略使得我們可以向Redis提示哪些key更適合被eviction。
另外,volatile-lru策略和volatile-random策略適合我們將一個Redis實例既應用於緩存和又應用於持久化存儲的時候,然而我們也可以通過使用兩個Redis實例來達到相同的效果,值得一提的是將key設置過期時間實際上會消耗更多的內存,因此我們建議使用allkeys-lru策略從而更有效率的使用內存。
備注:
1) 在64bit系統下,maxmemory設置為0表示不限制Redis內存使用,在32bit系統下,maxmemory隱式不能超過3GB。當Redis內存使用達到指定的限制時,就需要選擇一個置換的策略
2)置換策略是如何工作的
理解置換策略的執行方式是非常重要的,比如:
-
-
客戶端執行一條新命令,導致數據庫需要增加數據(比如set key value)
-
Redis會檢查內存使用,如果內存使用超過maxmemory,就會按照置換策略刪除一些key
-
新的命令執行成功
-
3) 在Redis 4.x版本以后支持le LFU策略,最少頻率使用
