redis?key鍵過(guò)期刪除策略及淘汰機(jī)制探究
redis過(guò)期刪除
redis的鍵可以設(shè)置過(guò)期時(shí)間,但是并不是每個(gè)鍵一到過(guò)期時(shí)間就會(huì)立即刪除,redis不可能給每個(gè)設(shè)置過(guò)期時(shí)間的key上添加一個(gè)定時(shí)器來(lái)監(jiān)視是否過(guò)期,CPU根本承受不了如此多的定時(shí)線程
注意:我使用的版本是6.0.10,不同版本可能略有差別
刪除策略
存在的刪除策略:
- 定時(shí)刪除 在設(shè)置鍵的同時(shí)創(chuàng)建定時(shí)器,過(guò)期時(shí)間到了就執(zhí)行對(duì)鍵的刪除,這種策略對(duì)內(nèi)存使用率有優(yōu)勢(shì),但是占用CPU資源太多
- 定期刪除 每隔特定時(shí)間對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次掃描,檢測(cè)并刪除其中過(guò)期的鍵值對(duì)
- 惰性刪除 鍵值對(duì)過(guò)期暫時(shí)不進(jìn)行刪除,當(dāng)獲取鍵時(shí)先查看是否已經(jīng)過(guò)期,過(guò)期則進(jìn)行刪除,這種策略可能會(huì)由于一些過(guò)期key一直沒有被訪問(wèn),浪費(fèi)一定的內(nèi)存
redis采用的策略是定期刪除+惰性刪除
定期刪除是指每隔一段時(shí)間去檢查是否有過(guò)期的key,如果有則刪除
惰性刪除是指在獲取key的時(shí)候檢查一下這個(gè)key是否過(guò)期
定期刪除的配置是hz(默認(rèn)是10,即每秒十次掃描)
首先客戶端在嘗試訪問(wèn)某個(gè)key的時(shí)候,redis會(huì)檢查是否過(guò)期,如果過(guò)期則刪除,但是有些key是不會(huì)被訪問(wèn)到的,redis的定期刪除則會(huì)進(jìn)行掃描并刪除過(guò)期的key
- 從過(guò)期字典里隨機(jī)抽取20個(gè)key
- 刪除這20個(gè)key中已經(jīng)過(guò)期的key
- 如果過(guò)期的比例超過(guò)25%,則重復(fù)步驟一
過(guò)期的key過(guò)多會(huì)導(dǎo)致循環(huán)抽取刪除,為防止過(guò)度循環(huán),增加了掃描時(shí)間的上限,默認(rèn)不超過(guò)25ms
應(yīng)該避免同一時(shí)刻大量key同時(shí)過(guò)期
在主從結(jié)構(gòu)中,從服務(wù)器就算讀取到過(guò)期鍵也不會(huì)刪除,只有接收到主服務(wù)器發(fā)來(lái)的del命令之后才會(huì)刪除
淘汰機(jī)制
配置最大內(nèi)存的大小,如果超過(guò)該內(nèi)存大小,就會(huì)使用淘汰機(jī)制進(jìn)行淘汰
maxmemory 100mb
也可以通過(guò)命令進(jìn)行修改
127.0.0.1:6380> config set maxmemory 50mb OK 127.0.0.1:6380> config get maxmemory 1) "maxmemory" 2) "52428800"
由于使用定期刪除+惰性刪除機(jī)制,但是也可能很多過(guò)期的沒有被刪除掉導(dǎo)致內(nèi)存不足的情況,所以redis存在淘汰機(jī)制
- volatile-lru -> Evict using approximated LRU, only keys with an expire set 當(dāng)內(nèi)存不足時(shí),設(shè)置了過(guò)期時(shí)間的鍵,選取最近最少使用的鍵拋棄(Least Recently Used)
- allkeys-lru -> Evict any key using approximated LRU 當(dāng)內(nèi)存不足時(shí),對(duì)于所有的鍵,選取最近最少使用的鍵拋棄(Least Recently Used)
- volatile-lfu -> Evict using approximated LFU, only keys with an expire set 當(dāng)內(nèi)存不足時(shí),設(shè)置了過(guò)期時(shí)間的鍵,選取最少頻率使用的鍵拋棄(Least Frequently Used)
- allkeys-lfu -> Evict any key using approximated LFU 當(dāng)內(nèi)存不足時(shí),對(duì)于所有的鍵,選取最少頻率使用的鍵拋棄(Least Frequently Used)
- volatile-random -> Remove a random key having an expire set 當(dāng)內(nèi)存不足時(shí),對(duì)于設(shè)置過(guò)期時(shí)間的鍵,隨機(jī)選取鍵拋棄
- allkeys-random -> Remove a random key, any key 當(dāng)內(nèi)存不足時(shí),對(duì)于所有的鍵,隨機(jī)選取鍵拋棄
- volatile-ttl -> Remove the key with the nearest expire time (minor TTL) 當(dāng)內(nèi)存不足時(shí),拋棄最近要過(guò)期的鍵
- noeviction -> Don't evict anything, just return an error on write operations 默認(rèn)策略,不淘汰,如果內(nèi)存已滿,寫操作返回錯(cuò)誤
在使用volatile-lfu、volatile-random、volatile-ttl時(shí),如果沒有key可以淘汰,則與noeviction一樣在寫操作時(shí)返回錯(cuò)誤
獲取當(dāng)前的內(nèi)存策略
config get maxmemory-policy
可以在配置文件修改
maxmemory-policy noeviction
也可以使用命令設(shè)置
config set maxmemory-policy noeviction
在進(jìn)行LRU/LFU/TTL淘汰策略時(shí),并不是那么準(zhǔn)確,可以通過(guò)采樣率來(lái)進(jìn)行設(shè)置其準(zhǔn)確度,默認(rèn)是5,即隨機(jī)選出5個(gè)key,然后淘汰掉里面最近最少使用的key。
當(dāng)設(shè)置為10的時(shí)候就非常接近真正的LRU算法了,但是會(huì)消耗更多的CPU,5已經(jīng)是足夠好的結(jié)果了
maxmemory-samples 5
以上就是redis key鍵過(guò)期刪除策略及淘汰機(jī)制探究的詳細(xì)內(nèi)容,更多關(guān)于redis key鍵過(guò)期刪除的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Redis集群下過(guò)期key監(jiān)聽的實(shí)現(xiàn)代碼
- Redis過(guò)期Key刪除策略和內(nèi)存淘汰策略的實(shí)現(xiàn)
- Redis通過(guò)scan查找不過(guò)期的 key(方法詳解)
- Redis刪除過(guò)期key策略詳解
- redis key過(guò)期監(jiān)聽的實(shí)現(xiàn)示例
- Redis監(jiān)聽過(guò)期的key實(shí)現(xiàn)流程詳解
- Redis中key過(guò)期策略的實(shí)現(xiàn)
- Redis?key的過(guò)期時(shí)間和永久有效的實(shí)現(xiàn)
- Redis設(shè)置key的過(guò)期時(shí)間
- redis監(jiān)聽key過(guò)期事件的詳細(xì)步驟
- Redis Key過(guò)期刪除策略使用小結(jié)
相關(guān)文章
Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用
本文主要介紹了Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
redis中key使用冒號(hào)分隔的原理小結(jié)
Redis是一種高性能的鍵值對(duì)非關(guān)系型數(shù)據(jù)庫(kù),通過(guò)redis不同類型命令可以為其中的鍵指定不同的數(shù)據(jù)類型,其中每個(gè)鍵的命名規(guī)范通常使用冒號(hào)符號(hào)分隔字符串,本文主要介紹了redis中key使用冒號(hào)分隔的原理小結(jié),感興趣的可以了解一下2024-01-01
Redis面試必備之緩存設(shè)計(jì)規(guī)范與性能優(yōu)化詳解
你是否在使用Redis時(shí),不清楚Redis應(yīng)該遵循的設(shè)計(jì)規(guī)范而苦惱,你是否在Redis出現(xiàn)性能問(wèn)題時(shí),不知道該如何優(yōu)化而發(fā)愁,快跟隨小編一起學(xué)習(xí)起來(lái)吧2024-03-03
高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn)
這篇文章主要介紹了高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫(kù)的使用方法
這篇文章主要介紹了將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫(kù)的使用方法,原理其實(shí)只是將內(nèi)存虛擬作為磁盤,需要的朋友可以參考下2015-06-06

