1. 程式人生 > 其它 >redis的記憶體回收-過期策略和淘汰策略詳解

redis的記憶體回收-過期策略和淘汰策略詳解

redis記憶體回收機制

redis的記憶體回收主要圍繞一下兩個方面

  1. redis過期策略:刪除過期時間的key值
  2. redis淘汰策略:記憶體使用達到maxmemory上限時會觸發記憶體淘汰資料
    redis的過期策略和記憶體淘汰策略不是一回事

過期策略通常有以下3種

  1. 定時過期:為每個設定過期時間的key都需要建立一個定時器,到過期時間就會立即清除,該策略可以立即清除過期的資料,
    對記憶體很友好,但是會佔用大量的CPU資源去處理過期時間的資料,從而影響快取的影響時間和吞吐量
  2. 惰性過期:只有當訪問一個key時,才會判斷該key是否過期,如果過期立即清除,該策略可以最大化的節省CPU資源,
    但是卻對記憶體非常不友好,極端的情況可能出現大量的key沒有被再次訪問,從而不會被清除,佔用大量的記憶體
  3. 定期過期:每隔一定的時間,會掃描一定數量的資料庫中的expires字典中的一定數量的key,並清除已經過期的key
    該策略是定時過期和惰性過期的折中方案,通過調整定時掃描的時間間隔和每次掃描的限定耗時,就可以在不同情況下
    使CPU和記憶體達到最優的平衡效果
  • redis中同時使用了惰性過期和定期過期兩種過期策略

redis淘汰策略

  1. 簡介
    redis的記憶體淘汰策略是指當記憶體使用達到maxmemory極限時,需要使用LRL淘汰演算法來決定清理掉哪些資料,
    這樣才能保證新資料的存入
  2. LRU演算法
    redis預設情況下使用的就是LRU策略演算法
    LRU(least recently used)演算法最近最少使用演算法, 也就是說預設刪除最近最少使用的鍵
    但是一定要注意一點,redis並不會準確刪除所有鍵中最近最少使用的鍵,而是隨機抽取3個,刪除這3箇中最近最少使用的鍵
    3這個數字也是可以設定取樣大小的,如果設定為10,效果會更好,不過會耗費更多的CPU資源,配置檔案中可以通過maxmemory-samples設定
  3. 快取清理配置
    maxmemory用來設定redis存放資料的最大記憶體大小,一旦超出這個記憶體大小之後,就會立即呼叫LRU演算法清理掉一部分資料
    對於64 bit的機器,如果設定maxmemory=0,那麼就等於不限制記憶體使用,直到機器中的記憶體耗盡為止,但是在32 bit中,有一個隱式的閒置就是3GB
  4. 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: 當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,刪除最早過期的鍵
  5. 快取清理的流程
    (1)客戶端執行資料寫入操作
    (2)redis server接收到寫入操作後,檢查maxmemory的限制,如果超過了限制,那麼就根據policy清理掉一部分資料
    (3)寫入操作完成執行

總結

redis淘汰策略就是當記憶體達到maxmemory最大時又需要申請額外的記憶體空間,就需要通過淘汰策略淘汰掉一部分資料,給新資料騰出記憶體空間
redis淘汰策略的選取不會影響過期key的處理
redis過期策略用於處理過期的快取資料

參考文件