Redis的記憶體回收機制和記憶體過期淘汰策略詳解

若小寒發表於2019-03-23

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.快取清理的流程

  1. 客戶端執行資料寫入操作
  2. redis server接收到寫入操作之後,檢查maxmemory的限制,如果超過了限制,那麼就根據對應的policy清理掉部分資料
  3. 寫入操作完成執行。

總結

redis的記憶體淘汰策略用於處理記憶體不足時的需要申請額外空間的資料,記憶體淘汰策略的選取並不會影響過期的key的處理。過期策略用於處理過期的快取資料。

最後

大家覺得不錯可以點個贊在關注下,以後還會分享更多文章!


相關文章