Redis的內存回收機制和內存過期淘汰策略詳解

寫在前面:2020年面試必備的Java後端進階面試題總結了一份複習指南在Github上,內容詳細,圖文並茂,有需要學習的朋友可以Star一下!
GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master

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,可以設置內存達到最大閒置後,採取什麼策略來處理。
對應的淘汰策略規則如下:
noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯。
allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key。
allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key。
volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的key。
volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個key。
volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的key優先移除。
5.緩存清理的流程
客戶端執行數據寫入操作
redis server接收到寫入操作之後,檢查maxmemory的限制,如果超過了限制,那麼就根據對應的policy清理掉部分數據
寫入操作完成執行。

總結

redis的內存淘汰策略用於處理內存不足時的需要申請額外空間的數據,內存淘汰策略的選取並不會影響過期的key的處理。過期策略用於處理過期的緩存數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章