Redis過期策略和淘汰策略

一、Redis采用的過期策略

惰性刪除+定期刪除

惰性刪除流程

在進(jìn)行g(shù)et或setnx等操作時(shí),先檢查key是否過期,
若過期,刪除key,然后執(zhí)行相應(yīng)操作;
若沒過期,直接執(zhí)行相應(yīng)操作

定期刪除流程

遍歷每個(gè)數(shù)據(jù)庫(就是redis.conf中配置的"database"數(shù)量,默認(rèn)為16)
檢查當(dāng)前庫中的指定個(gè)數(shù)個(gè)key(默認(rèn)是每個(gè)庫檢查20個(gè)key,注意相當(dāng)于該循環(huán)執(zhí)行20次,循環(huán)體是下邊的描述)
如果當(dāng)前庫中沒有一個(gè)key設(shè)置了過期時(shí)間,直接執(zhí)行下一個(gè)庫的遍歷
隨機(jī)獲取一個(gè)設(shè)置了過期時(shí)間的key,檢查該key是否過期,如果過期,刪除key
判斷定期刪除操作是否已經(jīng)達(dá)到指定時(shí)長(zhǎng),若已經(jīng)達(dá)到,直接退出定期刪除。

二、淘汰策略

Redis在已使用內(nèi)存達(dá)到設(shè)定的上限時(shí),提供了6種數(shù)據(jù)淘汰策略(也就是maxmemory-policy可能的值):
在已經(jīng)設(shè)置了過期時(shí)間的數(shù)據(jù)中:
1、淘汰最近未使用的一些數(shù)據(jù),也就是volatile-lru策略
2、隨機(jī)淘汰一些數(shù)據(jù),也就是volatile-random策略
3、淘汰距離過期時(shí)間最近的一些數(shù)據(jù),也就是volatile-ttl策略
在全部數(shù)據(jù)中
4、淘汰最近未使用的一些數(shù)據(jù),也就是allkeys-lru策略
5、隨機(jī)淘汰一些數(shù)據(jù),也就是allkeys-random策略
不淘汰數(shù)據(jù)
6、內(nèi)存使用達(dá)到設(shè)定的內(nèi)存上限時(shí),用戶試圖存儲(chǔ)新數(shù)據(jù)時(shí)會(huì)直接返回錯(cuò)誤,也就是noeviction策略。
注:
lru是less recently used的縮寫,譯為最近最少使用;ttl是time to live的縮寫,譯為生存時(shí)間。
需要注意以下幾點(diǎn):
1、maxmemory-policy同樣可以在運(yùn)行時(shí)設(shè)置,用戶可以根據(jù)內(nèi)存的使用情況動(dòng)態(tài)的修改淘汰策略。
2、當(dāng)redis中的數(shù)據(jù)有一部分訪問頻率比較高,另外一部分訪問頻率較低時(shí),設(shè)置allkeys-lru比較合適?;蛘邿o法預(yù)測(cè)數(shù)據(jù)的使用頻率時(shí),allkeys-lru也是不錯(cuò)的選擇。
3、如果你需要循環(huán)或者掃描連續(xù)數(shù)據(jù)時(shí),換種說法就是數(shù)據(jù)的訪問概率大致相等時(shí),allkeys-random是不錯(cuò)的選擇。
4、當(dāng)你想通過設(shè)置不同的ttl來控制數(shù)據(jù)過期的先后順序時(shí),你可以設(shè)置為volatile-ttl。
5、當(dāng)你希望一些數(shù)據(jù)常駐內(nèi)存,另外一些數(shù)據(jù)可以被替換掉時(shí),就請(qǐng)用volatile-lru或volatile-random吧。
6、另外,數(shù)據(jù)的過期時(shí)間是存儲(chǔ)在另外一個(gè)哈希表中的,因此要耗費(fèi)更多的內(nèi)存空間,而allkeys-lru并不需要數(shù)據(jù)設(shè)置過期時(shí)間,因此對(duì)內(nèi)存的利用率更高。
7、volatile-lru, volatile-random 和 volatile-ttl 在沒有數(shù)據(jù)滿足被淘汰的條件時(shí),會(huì)和noeviction一樣返回錯(cuò)誤。
何時(shí)觸發(fā)淘汰數(shù)據(jù)的動(dòng)作
1、一個(gè)客戶端執(zhí)行指令,導(dǎo)致數(shù)據(jù)的增加時(shí)。
2、Redis檢測(cè)到內(nèi)存的使用已經(jīng)達(dá)到上限。
3、Redis自身執(zhí)行指令時(shí),等等。

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

相關(guān)閱讀更多精彩內(nèi)容

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