8.Redis內(nèi)存淘汰策略

內(nèi)存淘汰機(jī)制

當(dāng) Redis 內(nèi)存超出物理內(nèi)存限制時(shí),內(nèi)存的數(shù)據(jù)會(huì)開(kāi)始和磁盤產(chǎn)生頻繁的交換 (swap)。 交換會(huì)讓 Redis 的性能急劇下降,對(duì)于訪問(wèn)量比較頻繁的 Redis 來(lái)說(shuō),這樣低速的存取效率基本上等于不可用。

在生產(chǎn)環(huán)境中我們是不允許 Redis 出現(xiàn)交換行為的,為了限制最大使用內(nèi)存,Redis 提供了配置參數(shù) maxmemory 來(lái)限制內(nèi)存超出期望大小。

1.淘汰策略

當(dāng)實(shí)際內(nèi)存超出 maxmemory 時(shí),Redis 提供了6種可選策略 (maxmemory-policy) 來(lái)讓用戶自己決定該如何騰出新的空間以繼續(xù)提供讀寫服務(wù)。

  • noeviction:不會(huì)繼續(xù)服務(wù)寫請(qǐng)求 (DEL 請(qǐng)求可以繼續(xù)服務(wù)),讀請(qǐng)求可以繼續(xù)進(jìn)行。這樣可以保證不會(huì)丟失數(shù)據(jù),但是會(huì)讓線上的業(yè)務(wù)不能持續(xù)進(jìn)行。這是默認(rèn)的淘汰策略。
  • volatile-lru:嘗試淘汰設(shè)置了過(guò)期時(shí)間的 key,通過(guò)LRU算法驅(qū)逐最近最少使用的key。沒(méi)有設(shè)置過(guò)期時(shí)間的 key 不會(huì)被淘汰,這樣可以保證需要持久化的數(shù)據(jù)不會(huì)突然丟失。
  • volatile-random:嘗試淘汰設(shè)置了過(guò)期時(shí)間的 key,在設(shè)置了過(guò)期時(shí)間的key集合中隨機(jī)選擇數(shù)據(jù)淘汰。
  • volatile-ttl:嘗試淘汰設(shè)置了過(guò)期時(shí)間的 key,在設(shè)置了過(guò)期時(shí)間的key集合中優(yōu)先淘汰ttl小的。
  • allkeys-lru:和volatile-lru的區(qū)別在于要淘汰的key對(duì)象是全體key集合而不只是設(shè)置了過(guò)期時(shí)間的key,其他都一樣。
  • allkeys-random:和volatile-random的區(qū)別在于要淘汰的key對(duì)象是全體key集合而不只是設(shè)置了過(guò)期時(shí)間的key,其他都一樣。

Redis4.0后新增了兩個(gè)策略:

volatile-lfu:嘗試淘汰設(shè)置了過(guò)期時(shí)間的 key,通過(guò)LFU算法驅(qū)逐使用頻率最少的key。沒(méi)有設(shè)置過(guò)期時(shí)間的 key 不會(huì)被淘汰。

allkeys-lfu:和volatile-lfu的區(qū)別在于要淘汰的key對(duì)象是全體key集合而不只是設(shè)置了過(guò)期時(shí)間的key,其他都一樣。

2.LRU算法

Redis LRU使用的是近似LRU算法,它跟 LRU 算法還不太一樣。之所以不使用 LRU 算法,是因?yàn)樾枰拇罅康念~外的內(nèi)存,需要對(duì)現(xiàn)有的數(shù)據(jù)結(jié)構(gòu)進(jìn)行較大的改造。近似 LRU 算法則很簡(jiǎn)單,在現(xiàn)有數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上使用隨機(jī)采樣法來(lái)淘汰元素,能達(dá)到和 LRU 算法非常近似的效果。

Redis 為實(shí)現(xiàn)近似 LRU 算法,它給每個(gè) key 增加了一個(gè)額外的小字段,這個(gè)字段長(zhǎng)度24位,存的是最后一次被訪問(wèn)的時(shí)間戳,當(dāng)Redis執(zhí)行寫操作時(shí),發(fā)現(xiàn)內(nèi)存超出我們配置的{maxmemory},就會(huì)執(zhí)行一次LRU淘汰算法,隨機(jī)采樣出{maxmemory_samples}個(gè)樣本,默認(rèn)值為5,然后淘汰掉最舊的key,如果淘汰后內(nèi)存還超出{maxmemory},那就繼續(xù)隨機(jī)采樣淘汰,直到內(nèi)存低于{maxmemory}為止。

采樣數(shù)越大,近似LRU算法的效果越接近嚴(yán)格LRU算法,通過(guò)樣本數(shù)量調(diào)整算法的精度

淘汰池是一個(gè)數(shù)組,它的大小是${maxmemory_samples},在每次淘汰循環(huán)中,新隨機(jī)出的key列表會(huì)淘汰池中的key列表進(jìn)行融合,淘汰掉最舊的一個(gè)key之后,保留剩余較舊的key列表放入淘汰池等待下一個(gè)循環(huán)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容