如果沒有設置有效期,即使內存用完,redis 自動回收機制也是看設置了有效期的,不會動沒有設定有效期的,如果清理后內存還是滿的,就不再接受寫操作。
Redis無論有沒有設置expire,他都會遵循redis的配置好的刪除機制,在配置文件里設置:
redis最大內存不足"時,數據清除策略,默認為"volatile-lru"。
volatile-lru ->對"過期集合"中的數據采取LRU(近期最少使用)算法.如果對key使用"expire"指令指定了過期時間,那么此key將會被添加到"過期集合"中。將已經過期/LRU的數據優先移除.如果"過期集合"中全部移除仍不能滿足內存需求,將OOM.
allkeys-lru ->對所有的數據,采用LRU算法
volatile-random ->對"過期集合"中的數據采取"隨即選取"算法,並移除選中的K-V,直到"內存足夠"為止. 如果如果"過期集合"中全部移除全部移除仍不能滿足,將OOM
allkeys-random ->對所有的數據,采取"隨機選取"算法,並移除選中的K-V,直到"內存足夠"為止
volatile-ttl ->對"過期集合"中的數據采取TTL算法(最小存活時間),移除即將過期的數據.
noeviction ->不做任何干擾操作,直接返回OOM異常
另外,如果數據的過期不會對"應用系統"帶來異常,且系統中write操作比較密集,建議采取"allkeys-lru"。
由以上可以看出,對沒設置expire的數據,產生影響的是allkeys-lru機制,allkeys-random。
所以redis沒設置expire的數據是否會刪除,是由你自己選擇的刪除機制決定的。
在Redis服務器占用內存達到maxmemory最大的情況下,當再想增加內存占用時,會按maxmemory-policy刪除機制將老的數據刪除。這里簡單說一下volatile-lru,Redis會按LRU算法刪除設置了過期時間但還沒有過期的key,而對於沒有設置過期時間的key,Redis是永遠保留的。當然,如果你不想刪除沒有過期的key,那可以使用noeviction機制。