Redis--過期策略和內(nèi)存淘汰機(jī)制

引言

我們在使用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。

參考 (cloud.tencent.com/developer/a…)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容