高并發(fā)架構(gòu)系列:Redis的內(nèi)存回收原理,及內(nèi)存過期淘汰策略詳解

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)不定期答題、探討。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容