如果沒(méi)有設(shè)置有效期,即使內(nèi)存用完缘缚,redis 自動(dòng)回收機(jī)制也是看設(shè)置了有效期的勾笆,不會(huì)動(dòng)沒(méi)有設(shè)定有效期的,如果清理后內(nèi)存還是滿的桥滨,就不再接受寫(xiě)操作窝爪。
Redis無(wú)論有沒(méi)有設(shè)置expire,他都會(huì)遵循redis的配置好的刪除機(jī)制齐媒,在配置文件里設(shè)置:
redis最大內(nèi)存不足"時(shí),數(shù)據(jù)清除策略,默認(rèn)為"volatile-lru"蒲每。
volatile-lru ->對(duì)"過(guò)期集合"中的數(shù)據(jù)采取LRU(近期最少使用)算法.如果對(duì)key使用"expire"指令定了過(guò)期時(shí)間,那么此key將會(huì)被添加到"過(guò)期集合"中。將已經(jīng)過(guò)期/LRU的數(shù)據(jù)優(yōu)先移除.如果"過(guò)期集合"中全部移除仍不能滿足內(nèi)存需求,將OOM.
allkeys-lru ->對(duì)所有的數(shù)據(jù),采用LRU算法
volatile-random ->對(duì)"過(guò)期集合"中的數(shù)據(jù)采取"隨即選取"算法,并移除選中的K-V,直到"內(nèi)存夠"為止. 如果如果"過(guò)期集合"中全部移除全部移除仍不能滿足,將OOM
allkeys-random ->對(duì)所有的數(shù)據(jù),采取"隨機(jī)選取"算法,并移除選中的K-V,直到"內(nèi)存足夠"為止
volatile-ttl ->對(duì)"過(guò)期集合"中的數(shù)據(jù)采取TTL算法(最小存活時(shí)間),移除即將過(guò)期的數(shù)據(jù).
noeviction ->不做任何干擾操作,直接返回OOM異常
另外喻括,如果數(shù)據(jù)的過(guò)期不會(huì)對(duì)"應(yīng)用系統(tǒng)"帶來(lái)異常,且系統(tǒng)中write操作比較密集,建議采取"allkeys-lru"邀杏。
由以上可以看出,對(duì)沒(méi)設(shè)置expire的數(shù)據(jù)唬血,產(chǎn)生影響的是allkeys-lru機(jī)制望蜡,allkeys-random。
所以redis沒(méi)設(shè)置expire的數(shù)據(jù)是否會(huì)刪除刁品,是由你自己選擇的刪除機(jī)制決定的。
在Redis服務(wù)器占用內(nèi)存達(dá)到maxmemory最大的情況下浩姥,當(dāng)再想增加內(nèi)存占用時(shí)挑随,會(huì)按maxmemory-policy刪除機(jī)制將老的數(shù)據(jù)刪除。這里簡(jiǎn)單說(shuō)一下volatile-lru勒叠,Redis會(huì)按LRU算法刪除設(shè)置了過(guò)期時(shí)間但還沒(méi)有過(guò)期的key兜挨,而對(duì)于沒(méi)有設(shè)置過(guò)期時(shí)間的key,Redis是永遠(yuǎn)保留的眯分。當(dāng)然拌汇,如果你不想刪除沒(méi)有過(guò)期的key,那可以使用noeviction機(jī)制弊决。