Redis 刪除、淘汰策略
Redis 刪除策略
當有 key 設置了過期時間,就會有刪除策略
-
定時刪除
以 CPU 定時執行的方式換 Redis 內存(因爲會使用輪詢的方式一直耗用 CPU 資源),及時性不高,但是內存不會浪費
在 get 的時候,先判斷 key 是否會過期,如果過期了,會進行刪除,會導致有大量的垃圾數據佔用內存空間(因爲過期的數據在沒有進行 get 時,就會一直存在)
-
定期刪除
hz 10
-
在 Redis 啓動的時候讀取配置文件 hz 的值,默認爲 10
-
每秒執行 hz 次,
-
每次執行會一次執行:
serverCron() --> databaseCron() --> activeExpireCyle()
三個函數 -
activeExpireCyle() 對每個 expires[] (過期庫, 代表對應的數據庫,一共 0~15 個,每一個過期庫都會和 Redis 的數據庫對應)進行逐一檢查,每次執行 250ms/hz,默認情況就是 25ms
-
對某個 expires[*] 檢測時,隨機挑選 N(默認 20)個 key 檢查
-
如果 key 超時,刪除 key
-
如果一輪中刪除的 key 的數量 > N * 25%,循環該過程
-
如果一輪中刪除的 key 的數量 <N * 25%,檢查下一個 expires[ *]
current_db 用於記錄 activeExpireCyle() 進入哪一個 expire[ *] 執行,如果時間到了,那麼下次根據 current_db 繼續執行
Reids 採用的是惰性刪除 + 定期刪除兩種策略結合使用。
Redis 淘汰策略
當 Redis 內存滿了,在進行 set 的時候,就會觸發淘汰策略
LRU(Least recently used):最近最少使用,針對時間
LFU(Least frequently used):最近最不頻繁使用,針對訪問次數
-
**maxmemory:**最大可使用內存,佔用物理內存的比例,默認爲 0,表示不限制,生產環境一般根據需求設置,通常在 50 以上
-
**maxmemory-policy:**達到最大內存後,對挑選出來的數據進行刪除策略(volatile:針對過期數據的策略,allkeys:針對所有數據的策略)
-
volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最長時間沒有使用的數據**(推薦)**
-
allkeys-lru:從數據集(server.db[i].dict)中挑選最長時間沒有使用的數據淘汰
-
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰**(推薦)**
-
volatile-lfu:從已設置過期時間的數據集(server.db[i].expires)中挑選最近使用次數最少的數據淘汰
-
allkeys-lfu:從數據集(server.db[i].dict)中挑選最近使用次數最少的數據淘汰
-
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中隨機挑選數據淘汰
-
allkeys-random:從數據集(server.db[i].dict)中隨機挑選數據淘汰
-
noeviction:驅逐,禁止驅逐數據**(默認策略)**
-
**maxmemory-sample:**每次選取待刪除的數據個數,選取數據時並不會進行全表掃描,採用隨機獲取數據的方式作爲待檢測刪除數據,默認選擇 5 個樣本進行檢測
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/DWtVzjHbNcUFBX2l3WXTEA