淺談Redis中的內(nèi)存淘汰策略和過期鍵刪除策略
redis是我們現(xiàn)在最常用的一個(gè)工具,幫助我們建設(shè)系統(tǒng)的高可用,高性能。
而且我們都知道redis是一個(gè)完全基于內(nèi)存的工具,這也是redis速度快的一個(gè)原因,當(dāng)我們往redis中不斷緩存數(shù)據(jù)的時(shí)候,其內(nèi)存總有滿的時(shí)候(而且內(nèi)存是很貴的東西,盡量省著點(diǎn)用),所以盡可能把有用的數(shù)據(jù),或者使用頻繁的數(shù)據(jù)緩存在redis中,物盡其用。
那么如果正在使用的redis內(nèi)存用完了,我們應(yīng)該怎么取舍redis中已存在的數(shù)據(jù)和即將要存入的數(shù)據(jù)呢,我們要怎么處理呢?
redis官方提供了8種不同的淘汰策略
redis.conf 是個(gè)好東西,幾乎redis的所有配置都可以在這里找到,根據(jù)conf中的說明也就能操作了

我們看下redis.conf中關(guān)于8中淘汰策略的說明(本文使用redis版本是4.0.9)
volatile-lru -> Evict using approximated LRU among the keys with an expire set. allkeys-lru -> Evict any key using approximated LRU. volatile-lfu -> Evict using approximated LFU among the keys with an expire set. allkeys-lfu -> Evict any key using approximated LFU. volatile-random -> Remove a random key among the ones with an expire set. allkeys-random -> Remove a random key, any key. volatile-ttl -> Remove the key with the nearest expire time (minor TTL) noeviction -> Don't evict anything, just return an error on write operations. # LRU means Least Recently Used(最近最少使用的,時(shí)間) # LFU means Least Frequently Used(最不經(jīng)常使用的,次數(shù)) # The default is: maxmemory-policy noeviction
上文是從redis.conf中摘出來關(guān)于淘汰策略的8種配置以及設(shè)置說明,其中maxmemory-policy noeviction 代表了淘汰策略默認(rèn)的是noeviction,我們可以根據(jù)自己的業(yè)務(wù)需求修改合適的策略。
英文看不懂的看下面的中文
8種淘汰策略
- volatile-lru:在設(shè)置過期時(shí)間的數(shù)據(jù)中淘汰最少使用的數(shù)據(jù)。
- allkeys-lru:在所有的數(shù)據(jù)中淘汰最少使用的數(shù)據(jù)。
- volatile-lfu:在設(shè)置過期時(shí)間的數(shù)據(jù)中淘汰使用頻率最低的數(shù)據(jù)。
- allkeys-lfu:在所有的數(shù)據(jù)中淘汰使用使用頻率最低的數(shù)據(jù)。
- volatile-random:在設(shè)置過期時(shí)間的數(shù)據(jù)中淘汰任意隨機(jī)數(shù)據(jù)。
- allkeys-random:在所有的數(shù)據(jù)中隨機(jī)淘汰數(shù)據(jù)。
- volatile-ttl:在設(shè)置過期時(shí)間的數(shù)據(jù)中淘汰最早過期的數(shù)據(jù)。
- noeviction:默認(rèn)策略,不淘汰數(shù)據(jù),新增或者修改數(shù)據(jù)會(huì)拋異常,但是讀操作正常進(jìn)行,不受影響
上面是內(nèi)存不足的淘汰策略,還有一種是過期鍵的刪除策略,兩者是不同,不要搞混了
過期鍵的刪除策略
- 定時(shí)過期:每個(gè)設(shè)置過期時(shí)間的key都需要?jiǎng)?chuàng)建一個(gè)定時(shí)器,到過期時(shí)間就會(huì)立即清除。該策略可以立即清除過期的數(shù)據(jù),對(duì)內(nèi)存很友好;但是會(huì)占用大量的CPU資源去處理過期的數(shù)據(jù),從而影響緩存的響應(yīng)時(shí)間和吞吐量。
- 惰性過期:只有當(dāng)訪問一個(gè)key時(shí),才會(huì)判斷該key是否已過期,過期則清除。該策略可以最大化地節(jié)省CPU資源,卻對(duì)內(nèi)存非常不友好。極端情況可能出現(xiàn)大量的過期key沒有再次被訪問,從而不會(huì)被清除,占用大量?jī)?nèi)存。
- 定期過期:每隔一定的時(shí)間,會(huì)掃描一定數(shù)量的數(shù)據(jù)庫的expires字典中一定數(shù)量的key,并清除其中已過期的key。該策略是前兩者的一個(gè)折中方案。通過調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的限定耗時(shí),可以在不同情況下使得CPU和內(nèi)存資源達(dá)到最優(yōu)的平衡效果。
expires字典會(huì)保存所有設(shè)置了過期時(shí)間的key的過期時(shí)間數(shù)據(jù),其中,
key是指向鍵空間中的某個(gè)鍵的指針,
value是該鍵的毫秒精度的UNIX時(shí)間戳表示的過期時(shí)間。
鍵空間是指該Redis集群中保存的所有鍵。
總結(jié)
Redis的內(nèi)存淘汰策略的選取并不會(huì)影響過期的key的處理。內(nèi)存淘汰策略用于處理內(nèi)存不足時(shí)的需要申請(qǐng)額外空間的數(shù)據(jù);過期策略用于處理過期的緩存數(shù)據(jù)。
到此這篇關(guān)于淺談Redis中的內(nèi)存淘汰策略和過期鍵刪除策略的文章就介紹到這了,更多相關(guān)Redis內(nèi)存淘汰和過期鍵刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Lua腳本實(shí)現(xiàn)Redis原子操作的示例
本文主要介紹了用Lua腳本實(shí)現(xiàn)Redis原子操作的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
redis+lua實(shí)現(xiàn)分布式限流的示例
本文主要介紹了redis+lua實(shí)現(xiàn)分布式限流的示例,可以實(shí)現(xiàn)復(fù)雜的限流邏輯,如滑動(dòng)窗口限流,并且避免了多步操作導(dǎo)致的并發(fā)問題,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解
這篇文章主要為大家介紹了redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Redis 如何批量設(shè)置過期時(shí)間(PIPLINE的使用)
有時(shí)候我們并不希望redis的key一直存在。例如緩存,驗(yàn)證碼等數(shù)據(jù),我們希望它們能在一定時(shí)間內(nèi)自動(dòng)的被銷毀。本文就詳細(xì)的介紹一下Redis 如何批量設(shè)置過期時(shí)間,感興趣的可以了解一下2021-11-11
redis中redisson實(shí)現(xiàn)鎖自動(dòng)延時(shí)
redisson作為分布式鎖能夠解決分布式的加鎖解鎖問題,還能夠?qū)崿F(xiàn)鎖的設(shè)置存活時(shí)間以及自動(dòng)續(xù)期,本文主要介紹了redis中redisson實(shí)現(xiàn)鎖自動(dòng)延時(shí),感興趣的可以了解一下2024-02-02
基于Redis過期事件實(shí)現(xiàn)訂單超時(shí)取消
這篇文章主要介紹了基于Redis過期事件實(shí)現(xiàn)訂單超時(shí)取消,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
RedisTemplate 實(shí)現(xiàn)基于Value 操作的簡(jiǎn)易鎖機(jī)制(示例代碼)
本文將介紹如何使用 RedisTemplate 的 opsForValue().setIfAbsent() 方法來實(shí)現(xiàn)一種簡(jiǎn)單的鎖機(jī)制,并提供一個(gè)示例代碼,展示如何在 Java 應(yīng)用中利用這一機(jī)制來保護(hù)共享資源的訪問,感興趣的朋友跟隨小編一起看看吧2024-05-05

