Redis內(nèi)存回收機(jī)制
Redis的內(nèi)存回收主要圍繞以下兩個(gè)方面:
1.Redis過期策略:刪除過期時(shí)間的key值
2.Redis淘汰策略:內(nèi)存使用到達(dá)maxmemory上限時(shí)觸發(fā)內(nèi)存淘汰數(shù)據(jù)
Redis的過期策略和內(nèi)存淘汰策略不是一件事,實(shí)際研發(fā)中不要弄混淆了,下面會(huì)完整的介紹兩者。
Redis過期策略
過期策略通常有以下三種:
1.定時(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í)間和吞吐量。
2.惰性過期
只有當(dāng)訪問一個(gè)key時(shí),才會(huì)判斷該key是否已過期,過期則清除。該策略可以最大化地節(jié)省CPU資源,卻對(duì)內(nèi)存非常不友好。極端情況可能出現(xiàn)大量的過期key沒有再次被訪問,從而不會(huì)被清除,占用大量內(nèi)存。
3.定期過期
每隔一定的時(shí)間,會(huì)掃描一定數(shù)量的數(shù)據(jù)庫的expires字典中一定數(shù)量的key,并清除其中已過期的key。該策略是前兩者的一個(gè)折中方案。通過調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的限定耗時(shí),可以在不同情況下使得CPU和內(nèi)存資源達(dá)到最優(yōu)的平衡效果。
Redis中同時(shí)使用了惰性過期和定期過期兩種過期策略。
Redis淘汰策略
1.簡介
Redis的內(nèi)存淘汰策略,是指當(dāng)內(nèi)存使用達(dá)到maxmemory極限時(shí),需要使用LAU淘汰算法來決定清理掉哪些數(shù)據(jù),以保證新數(shù)據(jù)的存入。
2、LRU算法
Redis默認(rèn)情況下就是使用LRU策略算法。
LRU算法(least RecentlyUsed),最近最少使用算法,也就是說默認(rèn)刪除最近最少使用的鍵。
但是一定要注意一點(diǎn)!redis中并不會(huì)準(zhǔn)確的刪除所有鍵中最近最少使用的鍵,而是隨機(jī)抽取3個(gè)鍵,刪除這三個(gè)鍵中最近最少使用的鍵。
那么3這個(gè)數(shù)字也是可以可以設(shè)置采樣的大小,如果設(shè)置為10,那么效果會(huì)更好,不過也會(huì)耗費(fèi)更多的CPU資源。對(duì)應(yīng)位置是配置文件中的maxmeory-samples。
3.緩存清理配置
maxmemory用來設(shè)置redis存放數(shù)據(jù)的最大的內(nèi)存大小,一旦超出這個(gè)內(nèi)存大小之后,就會(huì)立即使用LRU算法清理掉部分?jǐn)?shù)據(jù)。
對(duì)于64 bit的機(jī)器,如果maxmemory設(shè)置為0,那么就默認(rèn)不限制內(nèi)存的使用,直到耗盡機(jī)器中所有的內(nèi)存為止;,但是對(duì)于32 bit的機(jī)器,有一個(gè)隱式的閑置就是3GB
4.Redis數(shù)據(jù)淘汰策略
maxmemory-policy,可以設(shè)置內(nèi)存達(dá)到最大閑置后,采取什么策略來處理。
對(duì)應(yīng)的淘汰策略規(guī)則如下:
1)noeviction:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),新寫入操作會(huì)報(bào)錯(cuò)。
2)allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的key。
3)allkeys-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在鍵空間中,隨機(jī)移除某個(gè)key。
4)volatile-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,移除最近最少使用的key。
5)volatile-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,隨機(jī)移除某個(gè)key。
6)volatile-ttl:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),在設(shè)置了過期時(shí)間的鍵空間中,有更早過期時(shí)間的key優(yōu)先移除。
5.緩存清理的流程
1)客戶端執(zhí)行數(shù)據(jù)寫入操作
2)redis server接收到寫入操作之后,檢查maxmemory的限制,如果超過了限制,那么就根據(jù)對(duì)應(yīng)的policy清理掉部分?jǐn)?shù)據(jù)
3)寫入操作完成執(zhí)行。
總結(jié)
redis的內(nèi)存淘汰策略用于處理內(nèi)存不足時(shí)的需要申請額外空間的數(shù)據(jù),內(nèi)存淘汰策略的選取并不會(huì)影響過期的key的處理。過期策略用于處理過期的緩存數(shù)據(jù)。
以上就是redis內(nèi)存回收機(jī)制的詳解,更多Kafka消息隊(duì)列、Dubbo、分庫分表等高并發(fā)架構(gòu)設(shè)計(jì),具體請參考高并發(fā)架構(gòu)66期專題。
阿里架構(gòu)師進(jìn)階專題(已更新至90期)
覺得不錯(cuò)請點(diǎn)贊支持,歡迎留言或進(jìn)我的個(gè)人群179961551領(lǐng)取【架構(gòu)資料專題目合集90期】、【BATJTMD大廠JAVA面試真題1000+】,本群專用于學(xué)習(xí)交流技術(shù)、分享面試機(jī)會(huì),拒絕廣告,我也會(huì)在群內(nèi)不定期答題、探討。