redis?key鍵過期刪除策略及淘汰機制探究
redis過期刪除
redis的鍵可以設置過期時間,但是并不是每個鍵一到過期時間就會立即刪除,redis不可能給每個設置過期時間的key上添加一個定時器來監(jiān)視是否過期,CPU根本承受不了如此多的定時線程
注意:我使用的版本是6.0.10,不同版本可能略有差別
刪除策略
存在的刪除策略:
- 定時刪除 在設置鍵的同時創(chuàng)建定時器,過期時間到了就執(zhí)行對鍵的刪除,這種策略對內(nèi)存使用率有優(yōu)勢,但是占用CPU資源太多
- 定期刪除 每隔特定時間對數(shù)據(jù)庫進行一次掃描,檢測并刪除其中過期的鍵值對
- 惰性刪除 鍵值對過期暫時不進行刪除,當獲取鍵時先查看是否已經(jīng)過期,過期則進行刪除,這種策略可能會由于一些過期key一直沒有被訪問,浪費一定的內(nèi)存
redis采用的策略是定期刪除+惰性刪除
定期刪除是指每隔一段時間去檢查是否有過期的key,如果有則刪除
惰性刪除是指在獲取key的時候檢查一下這個key是否過期
定期刪除的配置是hz(默認是10,即每秒十次掃描)
首先客戶端在嘗試訪問某個key的時候,redis會檢查是否過期,如果過期則刪除,但是有些key是不會被訪問到的,redis的定期刪除則會進行掃描并刪除過期的key
- 從過期字典里隨機抽取20個key
- 刪除這20個key中已經(jīng)過期的key
- 如果過期的比例超過25%,則重復步驟一
過期的key過多會導致循環(huán)抽取刪除,為防止過度循環(huán),增加了掃描時間的上限,默認不超過25ms
應該避免同一時刻大量key同時過期
在主從結(jié)構(gòu)中,從服務器就算讀取到過期鍵也不會刪除,只有接收到主服務器發(fā)來的del命令之后才會刪除
淘汰機制
配置最大內(nèi)存的大小,如果超過該內(nèi)存大小,就會使用淘汰機制進行淘汰
maxmemory 100mb
也可以通過命令進行修改
127.0.0.1:6380> config set maxmemory 50mb OK 127.0.0.1:6380> config get maxmemory 1) "maxmemory" 2) "52428800"
由于使用定期刪除+惰性刪除機制,但是也可能很多過期的沒有被刪除掉導致內(nèi)存不足的情況,所以redis存在淘汰機制
- volatile-lru -> Evict using approximated LRU, only keys with an expire set 當內(nèi)存不足時,設置了過期時間的鍵,選取最近最少使用的鍵拋棄(Least Recently Used)
- allkeys-lru -> Evict any key using approximated LRU 當內(nèi)存不足時,對于所有的鍵,選取最近最少使用的鍵拋棄(Least Recently Used)
- volatile-lfu -> Evict using approximated LFU, only keys with an expire set 當內(nèi)存不足時,設置了過期時間的鍵,選取最少頻率使用的鍵拋棄(Least Frequently Used)
- allkeys-lfu -> Evict any key using approximated LFU 當內(nèi)存不足時,對于所有的鍵,選取最少頻率使用的鍵拋棄(Least Frequently Used)
- volatile-random -> Remove a random key having an expire set 當內(nèi)存不足時,對于設置過期時間的鍵,隨機選取鍵拋棄
- allkeys-random -> Remove a random key, any key 當內(nèi)存不足時,對于所有的鍵,隨機選取鍵拋棄
- volatile-ttl -> Remove the key with the nearest expire time (minor TTL) 當內(nèi)存不足時,拋棄最近要過期的鍵
- noeviction -> Don't evict anything, just return an error on write operations 默認策略,不淘汰,如果內(nèi)存已滿,寫操作返回錯誤
在使用volatile-lfu、volatile-random、volatile-ttl時,如果沒有key可以淘汰,則與noeviction一樣在寫操作時返回錯誤
獲取當前的內(nèi)存策略
config get maxmemory-policy
可以在配置文件修改
maxmemory-policy noeviction
也可以使用命令設置
config set maxmemory-policy noeviction
在進行LRU/LFU/TTL淘汰策略時,并不是那么準確,可以通過采樣率來進行設置其準確度,默認是5,即隨機選出5個key,然后淘汰掉里面最近最少使用的key。
當設置為10的時候就非常接近真正的LRU算法了,但是會消耗更多的CPU,5已經(jīng)是足夠好的結(jié)果了
maxmemory-samples 5
以上就是redis key鍵過期刪除策略及淘汰機制探究的詳細內(nèi)容,更多關(guān)于redis key鍵過期刪除的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
redis做websocket分布式消息推送服務的實現(xiàn)
本文介紹了使用Redis作為消息隊列實現(xiàn)WebSocket分布式消息推送服務的方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-12-12
深入解析RedisJSON之如何在Redis中直接處理JSON數(shù)據(jù)
JSON已經(jīng)成為現(xiàn)代應用程序之間數(shù)據(jù)傳輸?shù)耐ㄓ酶袷?然而,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在處理JSON數(shù)據(jù)時可能會遇到性能瓶頸,本文將詳細介紹RedisJSON的工作原理、關(guān)鍵操作、性能優(yōu)勢以及使用場景,感興趣的朋友一起看看吧2024-05-05
SpringBoot整合Mybatis-plus和Redis實現(xiàn)投票功能
投票功能是一個非常常見的Web應用場景,這篇文章將為大家介紹一下如何將Redis和Mybatis-plus整合到SpringBoot中,實現(xiàn)投票功能,感興趣的可以了解一下2023-05-05
Redis和數(shù)據(jù)庫 數(shù)據(jù)同步問題的解決
這篇文章主要介紹了Redis和數(shù)據(jù)庫 數(shù)據(jù)同步問題的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Windows環(huán)境下打開Redis閃退的解決方案
每次使用完Redis后,我們習慣性的動作是直接叉掉doc頁面,這樣導致的結(jié)果是Redis在后臺繼續(xù)運行,沒有關(guān)閉,所以當再次打開的時候直接閃退,文中有詳細的解決方案,需要的朋友可以參考下2024-03-03

