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ù),對內(nèi)存很友好嵌言;但是會(huì)占用大量的CPU資源去處理過期的數(shù)據(jù)嗅回,從而影響緩存的響應(yīng)時(shí)間和吞吐量。
2.惰性過期
只有當(dāng)訪問一個(gè)key時(shí)摧茴,才會(huì)判斷該key是否已過期绵载,過期則清除。該策略可以最大化地節(jié)省CPU資源苛白,卻對內(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資源仍翰。對應(yīng)位置是配置文件中的maxmeory-samples。
3.緩存清理配置
maxmemory用來設(shè)置redis存放數(shù)據(jù)的最大的內(nèi)存大小观话,一旦超出這個(gè)內(nèi)存大小之后予借,就會(huì)立即使用LRU算法清理掉部分?jǐn)?shù)據(jù)。
對于64 bit的機(jī)器频蛔,如果maxmemory設(shè)置為0灵迫,那么就默認(rèn)不限制內(nèi)存的使用,直到耗盡機(jī)器中所有的內(nèi)存為止;晦溪,但是對于32 bit的機(jī)器瀑粥,有一個(gè)隱式的閑置就是3GB
4.Redis數(shù)據(jù)淘汰策略
maxmemory-policy,可以設(shè)置內(nèi)存達(dá)到最大閑置后三圆,采取什么策略來處理狞换。
對應(yīng)的淘汰策略規(guī)則如下:
image.png
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ù)對應(yīng)的policy清理掉部分?jǐn)?shù)據(jù)
3)寫入操作完成執(zhí)行闰歪。
總結(jié)
redis的內(nèi)存淘汰策略用于處理內(nèi)存不足時(shí)的需要申請額外空間的數(shù)據(jù),內(nèi)存淘汰策略的選取并不會(huì)影響過期的key的處理蓖墅。過期策略用于處理過期的緩存數(shù)據(jù)库倘。
歡迎添加小編的Java學(xué)習(xí)群,不管你是小白還是大牛论矾,小編我都?xì)g迎教翩,不定期分享干貨,包括小編自己整理的一份2019年最新的Java資料和0基礎(chǔ)入門教程視頻拇囊,歡迎初學(xué)和進(jìn)階中的小伙伴迂曲。在不忙的時(shí)間我會(huì)給大家解惑
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!