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