redis的記憶體回收-過期策略和淘汰策略詳解
阿新 • • 發佈:2022-03-30
redis記憶體回收機制
redis的記憶體回收主要圍繞一下兩個方面
- redis過期策略:刪除過期時間的key值
- redis淘汰策略:記憶體使用達到maxmemory上限時會觸發記憶體淘汰資料
redis的過期策略和記憶體淘汰策略不是一回事
過期策略通常有以下3種
- 定時過期:為每個設定過期時間的key都需要建立一個定時器,到過期時間就會立即清除,該策略可以立即清除過期的資料,
對記憶體很友好,但是會佔用大量的CPU資源去處理過期時間的資料,從而影響快取的影響時間和吞吐量 - 惰性過期:只有當訪問一個key時,才會判斷該key是否過期,如果過期立即清除,該策略可以最大化的節省CPU資源,
但是卻對記憶體非常不友好,極端的情況可能出現大量的key沒有被再次訪問,從而不會被清除,佔用大量的記憶體 - 定期過期:每隔一定的時間,會掃描一定數量的資料庫中的expires字典中的一定數量的key,並清除已經過期的key
該策略是定時過期和惰性過期的折中方案,通過調整定時掃描的時間間隔和每次掃描的限定耗時,就可以在不同情況下
使CPU和記憶體達到最優的平衡效果
- redis中同時使用了惰性過期和定期過期兩種過期策略
redis淘汰策略
- 簡介
redis的記憶體淘汰策略是指當記憶體使用達到maxmemory極限時,需要使用LRL淘汰演算法來決定清理掉哪些資料,
這樣才能保證新資料的存入 - LRU演算法
redis預設情況下使用的就是LRU策略演算法
LRU(least recently used)演算法最近最少使用演算法, 也就是說預設刪除最近最少使用的鍵
但是一定要注意一點,redis並不會準確刪除所有鍵中最近最少使用的鍵,而是隨機抽取3個,刪除這3箇中最近最少使用的鍵
3這個數字也是可以設定取樣大小的,如果設定為10,效果會更好,不過會耗費更多的CPU資源,配置檔案中可以通過maxmemory-samples設定 - 快取清理配置
maxmemory用來設定redis存放資料的最大記憶體大小,一旦超出這個記憶體大小之後,就會立即呼叫LRU演算法清理掉一部分資料
對於64 bit的機器,如果設定maxmemory=0,那麼就等於不限制記憶體使用,直到機器中的記憶體耗盡為止,但是在32 bit中,有一個隱式的閒置就是3GB - redis資料淘汰策略
maxmemory-policy 可以設定記憶體到達最大閒置後,採取什麼策略來處理
對應的淘汰策略規則如下:
規則名稱 規則說明
volatile_lru 使用lru演算法刪除一個鍵(只對設定了生存時間的鍵)
allkeys_lru 使用lru演算法刪除一個鍵
volatile_random 隨機刪除一個鍵(只對設定了生存時間的鍵)
allkeys_random 隨機刪除一個鍵
volatile_ttl 刪除生存時間最近的一個鍵
noeviction 不刪除鍵,只返回錯誤
(1) noeviction: 當記憶體不足以容納新寫入的資料時,新寫入資料會報錯
(2) allkeys_lru: 當記憶體不足以容納新寫入資料時,在鍵空間中,刪除最近最少使用的鍵
(3) allkeys_random: 當記憶體不足以容納新寫入資料時,在鍵空間中,隨機刪除一個鍵
(4) volatile_lru: 當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,刪除最近最少使用的鍵
(5) volatile_random: 當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機刪除一個鍵
(6) volatile_ttl: 當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,刪除最早過期的鍵 - 快取清理的流程
(1)客戶端執行資料寫入操作
(2)redis server接收到寫入操作後,檢查maxmemory的限制,如果超過了限制,那麼就根據policy清理掉一部分資料
(3)寫入操作完成執行
總結
redis淘汰策略就是當記憶體達到maxmemory最大時又需要申請額外的記憶體空間,就需要通過淘汰策略淘汰掉一部分資料,給新資料騰出記憶體空間
redis淘汰策略的選取不會影響過期key的處理
redis過期策略用於處理過期的快取資料