Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解
Redis內存回收機制
Redis的內存回收主要圍繞以下兩個方面:
1.Redis過期策略:刪除過期時間的key值
2.Redis淘汰策略:內存使用到達maxmemory上限時觸發(fā)內存淘汰數(shù)據(jù)
Redis的過期策略和內存淘汰策略不是一件事,實際研發(fā)中不要弄混淆了,下面會完整的介紹兩者。
Redis過期策略
過期策略通常有以下三種:
1.定時過期
每個設置過期時間的key都需要創(chuàng)建一個定時器,到過期時間就會立即清除。該策略可以立即清除過期的數(shù)據(jù),對內存很友好;但是會占用大量的CPU資源去處理過期的數(shù)據(jù),從而影響緩存的響應時間和吞吐量。
2.惰性過期
只有當訪問一個key時,才會判斷該key是否已過期,過期則清除。該策略可以最大化地節(jié)省CPU資源,卻對內存非常不友好。極端情況可能出現(xiàn)大量的過期key沒有再次被訪問,從而不會被清除,占用大量內存。
3.定期過期
每隔一定的時間,會掃描一定數(shù)量的數(shù)據(jù)庫的expires字典中一定數(shù)量的key,并清除其中已過期的key。該策略是前兩者的一個折中方案。通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和內存資源達到最優(yōu)的平衡效果。
Redis中同時使用了惰性過期和定期過期兩種過期策略。
Redis淘汰策略
1.簡介
Redis的內存淘汰策略,是指當內存使用達到maxmemory極限時,需要使用LAU淘汰算法來決定清理掉哪些數(shù)據(jù),以保證新數(shù)據(jù)的存入。
2、LRU算法
Redis默認情況下就是使用LRU策略算法。
LRU算法(least RecentlyUsed),最近最少使用算法,也就是說默認刪除最近最少使用的鍵。
但是一定要注意一點!redis中并不會準確的刪除所有鍵中最近最少使用的鍵,而是隨機抽取3個鍵,刪除這三個鍵中最近最少使用的鍵。
那么3這個數(shù)字也是可以可以設置采樣的大小,如果設置為10,那么效果會更好,不過也會耗費更多的CPU資源。對應位置是配置文件中的maxmeory-samples。
3.緩存清理配置
maxmemory用來設置redis存放數(shù)據(jù)的最大的內存大小,一旦超出這個內存大小之后,就會立即使用LRU算法清理掉部分數(shù)據(jù)。
對于64 bit的機器,如果maxmemory設置為0,那么就默認不限制內存的使用,直到耗盡機器中所有的內存為止;,但是對于32 bit的機器,有一個隱式的閑置就是3GB
4.Redis數(shù)據(jù)淘汰策略
maxmemory-policy,可以設置內存達到最大閑置后,采取什么策略來處理。
對應的淘汰策略規(guī)則如下:
1)noeviction:當內存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯。
2)allkeys-lru:當內存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,移除最近最少使用的key。
3)allkeys-random:當內存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,隨機移除某個key。
4)volatile-lru:當內存不足以容納新寫入數(shù)據(jù)時,在設置了過期時間的鍵空間中,移除最近最少使用的key。
5)volatile-random:當內存不足以容納新寫入數(shù)據(jù)時,在設置了過期時間的鍵空間中,隨機移除某個key。
6)volatile-ttl:當內存不足以容納新寫入數(shù)據(jù)時,在設置了過期時間的鍵空間中,有更早過期時間的key優(yōu)先移除。
5.緩存清理的流程
1)客戶端執(zhí)行數(shù)據(jù)寫入操作
2)redis server接收到寫入操作之后,檢查maxmemory的限制,如果超過了限制,那么就根據(jù)對應的policy清理掉部分數(shù)據(jù)
3)寫入操作完成執(zhí)行。
總結
redis的內存淘汰策略用于處理內存不足時的需要申請額外空間的數(shù)據(jù),內存淘汰策略的選取并不會影響過期的key的處理。過期策略用于處理過期的緩存數(shù)據(jù)。
你可能也喜歡:
總結
以上是生活随笔為你收集整理的Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直通BAT必考题系列:7种JVM垃圾收集
- 下一篇: beeshell —— 开源的 Reac