一、內存淘汰策略
1.場景
redis的數據會在內存裏面,並且有配置設置redis最多能佔用多少內存,那就一定存在一個情況:當redis能佔用的內存已滿,但redis還需要再存新的數據在內存中,那怎麼辦?
這個就是內存淘汰策略解決的問題
2.配置redis最大佔用內存
1.通過配置文件設置
redis.conf配置文件中添加以下配置,設置Redis最大佔用內存大小爲多少,比如
maxmemory 100mb
2.通過命令修改
設置Redis最大佔用內存大小爲100M
127.0.0.1:6379> config set maxmemory 100mb
獲取配置的Redis能使用的最大內存大小
127.0.0.1:6379> config get maxmemory
如果設置爲0表示沒有限制
3.redis支持的內存淘汰策略
在配置文件redis.conf中
# maxmemory <bytes>
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# The default is:
# maxmemory-policy noeviction
redis3.0開始支持6種策略
1. volatile-lru
volatile表示:從設置了過期時間的數據集中根據某個算法(LRU)選出數據來淘汰。
lru表示:使用LRU(最近最少使用)算法進行淘汰
連起來就是:從設置過期時間的數據集(鍵值對過期時間的表,即 redisDb.expires)中挑選出最近最少使用的數據淘汰。
注意:沒有設置過期時間的key不會被淘汰。
特點:在增加內存空間的同時保證需要持久化的數據不會丟失。
2. volatile-ttl
volatile表示:從設置了過期時間的數據集中根據某個算法(ttl)選出數據來淘汰。
ttl表示:過期時間,即使越快過期的約先被淘汰。
注意:沒有設置過期時間的key不會被淘汰。
特點:在增加內存空間的同時保證需要持久化的數據不會丟失。
3. volatile-random
volatile表示:從設置了過期時間的數據集中根據某個算法(random)選出數據來淘汰。
random表示:隨機。從設置了過期時間的數據集中隨機選出數據來淘汰
注意:沒有設置過期時間的key不會被淘汰。
特點:在增加內存空間的同時保證需要持久化的數據不會丟失。
4. allkeys-lru
allkey表示:從所有的數據集中根據某個算法(lru)選出數據來淘汰。
lru表示:使用LRU(最近最少使用)算法進行淘汰
5. allkeys-random
allkey表示:從所有的數據集中根據某個算法(random)選出數據來淘汰。
random表示:隨機。從所有的數據集中隨機選出數據來淘汰
6. no-enviction
默認的淘汰策略
no表示:不淘汰
此時,當內存不足以容納新入數據時,新寫入操作就會報錯(DEL請求和部分特殊請求除外)
二、key過期策略
Redis的過期策略就是指當Redis中緩存的key過期了,Redis如何處理。
Redis中同時使用了惰性過期和定期過期
常見的過期策略有以下三種:
1.定時過期
每個設置過期時間的key都需要創建一個定時器,到過期時間就會立即清除。
優點:可以立即清除過期的數據,對內存很友好。
缺點:會佔用大量的CPU資源去處理過期的數據,從而影響緩存的響應時間和吞吐量。
2.惰性過期
只有當訪問一個key時,纔會判斷該key是否已過期,過期則清除。
優點:不過多佔用CPU資源去做過期處理
缺點:該策略可以最大化地節省CPU資源,卻對內存非常不友好。極端情況可能出現大量的過期key沒有再次被訪問,從而不會被清除,佔用大量內存。
3.定期過期
首先:redis中,每個庫(0-15)都有一個expires字典,它會保存所有設置了過期時間的key的過期時間數據。
定期過期是說的:每隔一定的時間,會掃描一定數量的庫(比如0-15號庫其中幾個庫)的expires字典中一定數量的key,並清除其中已過期的key。
該策略是前兩者的一個折中方案。通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和內存資源達到最優的平衡效果。