引言
我們在使用Redis的時候,很多情況下都會給數(shù)據(jù)加上expire過期時間,我一直以為只要過了過期時間,redis就會將這條數(shù)據(jù)給刪除掉,但是實(shí)際的情況是怎么樣的呢?我們先來看看幾種過期策略
過期策略
-
定時刪除策略
定時刪除,用一個定時器來負(fù)責(zé)監(jiān)視key,過期則自動刪除,與我之前想的一致,但是深究一下就會發(fā)現(xiàn)在如此注重效率的Redis中,使用這種刪除策略真的好嗎? 首先這種策略能夠使得內(nèi)存即使得到釋放,但是在數(shù)據(jù)量很大的時候卻十分消耗CPU資源,固然這種策略不妥。
-
定期刪除+惰性刪除策略
實(shí)際上Redis采用的是這種策略。定期刪除:redis默認(rèn)每個100ms檢查,是否有過期的key,有過期key則刪除。需要說明的是,redis不是每個100ms將所有的key檢查一次,而是隨機(jī)抽取進(jìn)行檢查,因此,如果只采用定期刪除策略,會導(dǎo)致很多key到時間沒有刪除。
于是便有了惰性刪除,在獲取某個Key的時候,Redis會去檢查這個Key是否已經(jīng)過期了,如果過期了,則刪除掉這個Key。
但是定期刪除+惰性刪除仍然存在一些問題:如果定期刪除沒有刪除某些Key,同時你也沒有去請求這些Key,那么隨著時間增加,這些過期的Key會在內(nèi)存中越來越多,因此還要采取內(nèi)存淘汰機(jī)制。
淘汰策略
在redis.conf文件中有如下一行對淘汰策略選擇的配置
# maxmemory-policy volatile-lru
我們先來看一下Redis中有哪些淘汰策略:
| 規(guī)則 | 描述 |
|---|---|
| noeviction | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯。應(yīng)該沒人會用這種策略 |
| allkeys-lru | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,移除最近最少使用的key(?) |
| allkeys-random | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,隨機(jī)移除某個key |
| volatile-lru | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,移除最近最少使用的key |
| volatile-random | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,隨機(jī)移除某個key |
| volatile-ttl | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,有更早過期時間的key優(yōu)先移除 |
不太推薦使用volatile-*,因?yàn)槿绻赗edis中沒有設(shè)置了過期時間的數(shù)據(jù),那么此時淘汰策略相當(dāng)于noeviction。