Redis過(guò)期鍵的刪除策略?
Redis的過(guò)期刪除策略就是:惰性刪除和定期刪除兩種策略配合使用。
惰性刪除:Redis的惰性刪除策略由db.c/expireIfNeeded函數(shù)實(shí)現(xiàn),所有鍵讀寫(xiě)命令執(zhí)行之前都會(huì)調(diào)用 expireIfNeeded函數(shù)對(duì)其進(jìn)行檢查,如果過(guò)期,則刪除該鍵,然后執(zhí)行鍵不存在的操作;未過(guò)期則不作操作,繼續(xù)執(zhí)行原有的命令。
定期刪除:由Redis.c/activeExpireCycle 函數(shù)實(shí)現(xiàn),函數(shù)以一定的頻率運(yùn)行,每次運(yùn)行時(shí),都從一定數(shù)量的數(shù)據(jù)庫(kù)中取出一定數(shù)量的隨機(jī)鍵進(jìn)行檢查,并刪除其中的過(guò)期鍵。
附:刪除key常見(jiàn)的三種處理方式。
1、定時(shí)刪除
在設(shè)置某個(gè)key 的過(guò)期時(shí)間同時(shí),我們創(chuàng)建一個(gè)定時(shí)器,讓定時(shí)器在該過(guò)期時(shí)間到來(lái)時(shí),立即執(zhí)行對(duì)其進(jìn)行刪除的操作。
優(yōu)點(diǎn):定時(shí)刪除對(duì)內(nèi)存是最友好的,能夠保存內(nèi)存的key一旦過(guò)期就能立即從內(nèi)存中刪除。
缺點(diǎn):對(duì)CPU最不友好,在過(guò)期鍵比較多的時(shí)候,刪除過(guò)期鍵會(huì)占用一部分 CPU 時(shí)間,對(duì)服務(wù)器的響應(yīng)時(shí)間和吞吐量造成影響。
2、惰性刪除
設(shè)置該key 過(guò)期時(shí)間后,我們不去管它,當(dāng)需要該key時(shí),我們?cè)跈z查其是否過(guò)期,如果過(guò)期,我們就刪掉它,反之返回該key。
優(yōu)點(diǎn):對(duì) CPU友好,我們只會(huì)在使用該鍵時(shí)才會(huì)進(jìn)行過(guò)期檢查,對(duì)于很多用不到的key不用浪費(fèi)時(shí)間進(jìn)行過(guò)期檢查。
缺點(diǎn):對(duì)內(nèi)存不友好,如果一個(gè)鍵已經(jīng)過(guò)期,但是一直沒(méi)有使用,那么該鍵就會(huì)一直存在內(nèi)存中,如果數(shù)據(jù)庫(kù)中有很多這種使用不到的過(guò)期鍵,這些鍵便永遠(yuǎn)不會(huì)被刪除,內(nèi)存永遠(yuǎn)不會(huì)釋放。從而造成內(nèi)存泄漏。
3、定期刪除
每隔一段時(shí)間,我們就對(duì)一些key進(jìn)行檢查,刪除里面過(guò)期的key。
優(yōu)點(diǎn):可以通過(guò)限制刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率來(lái)減少刪除操作對(duì) CPU 的影響。另外定期刪除,也能有效釋放過(guò)期鍵占用的內(nèi)存。
缺點(diǎn):難以確定刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率。如果執(zhí)行的太頻繁,定期刪除策略變得和定時(shí)刪除策略一樣,對(duì)CPU不友好。如果執(zhí)行的太少,那又和惰性刪除一樣了,過(guò)期鍵占用的內(nèi)存不會(huì)及時(shí)得到釋放。另外最重要的是,在獲取某個(gè)鍵時(shí),如果某個(gè)鍵的過(guò)期時(shí)間已經(jīng)到了,但是還沒(méi)執(zhí)行定期刪除,那么就會(huì)返回這個(gè)鍵的值,這是業(yè)務(wù)不能忍受的錯(cuò)誤。
Redis內(nèi)存淘汰機(jī)制?
當(dāng)現(xiàn)有內(nèi)存大于 maxmemory 時(shí),便會(huì)觸發(fā)Redis主動(dòng)淘汰內(nèi)存方式,有如下幾種淘汰方式:
Redis 4.0前提供 6種數(shù)據(jù)淘汰策略:
volatile-lru:利用LRU算法移除設(shè)置過(guò)過(guò)期時(shí)間的key (LRU:最近使用 Least Recently Used )
allkeys-lru:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的key(這個(gè)是最常用的)
volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
no-eviction:禁止驅(qū)逐數(shù)據(jù),也就是說(shuō)當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),新寫(xiě)入操作會(huì)報(bào)錯(cuò)。這個(gè)應(yīng)該沒(méi)人使用吧!
Redis 4.0后增加以下兩種:
volatile-lfu:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最不經(jīng)常使用的數(shù)據(jù)淘汰(LFU(Least Frequently Used)算法,也就是最頻繁被訪問(wèn)的數(shù)據(jù)將來(lái)最有可能被訪問(wèn)到)
allkeys-lfu:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在鍵空間中,移除最不經(jīng)常使用的key。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3025瀏覽量
74056 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62622 -
Redis
+關(guān)注
關(guān)注
0文章
375瀏覽量
10878
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論