Redis 過期時間與記憶體管理

SvenAugustus發表於2020-05-11

記憶體管理

當 Redis 作為快取使用時(此時快取僅作為熱點資料提高服務的訪問效能),需要考慮記憶體的限制,以及如何隨著業務的增長,僅保留熱點資料。

file

過期時間

Redis 所有的資料結構都可以設定過期時間,時間到了,Redis 會自動刪除相應的物件。
需要注意的:

  • 過期expire是以物件為單位,比如一個 hash 結構的過期是整個 hash 物件的過期,而不是其中的某個子 key。
  • 如果一個字串已經設定了過期時間,然後你呼叫了 set 方法修改了它,它的過期時間會消失。
127.0.0.1:6379> set  k1 aaa
OK
127.0.0.1:6379> expire k1 600
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 597
127.0.0.1:6379> set k1  bbb
OK
127.0.0.1:6379> ttl k1
(integer) -1...

淘汰過期的 Keys

Redis keys過期有兩種方式:被動和主動方式。

  • 被動

當一些客戶端嘗試訪問它時,key會被發現並主動的過期。

  • 主動

當然,這樣是不夠的,因為有些過期的keys,永遠不會訪問他們。

無論如何,這些keys應該過期,所以定時隨機測試設定keys的過期時間。所有這些過期的keys將會從金鑰空間刪除。

具體就是Redis每秒10次做的事情:

  • 1.測試隨機的20個keys進行相關過期檢測。
  • 2.刪除所有已經過期的keys。
  • 3.如果有多於25%的keys過期,重複步奏1.

這是一個平凡的概率演算法,基本上的假設是,我們的樣本是這個金鑰控制元件,

並且我們不斷重複過期檢測,直到過期的keys的百分百低於25%,這意味著,在任何給定的時刻,最多會清除1/4的過期keys。

記憶體淘汰

redis.conf 或 使用 CONFIG 命令配置 Redis的配置項:


maxmemory 100mb
maxmemory-policy [策略]

淘汰策略:

  • LRU - 最近很少沒碰

    對最近很少使用(所有或有過期時間的)的key優先淘汰

    • allkeys-lru 嘗試回收最少使用的鍵(LRU),使得新新增的資料有空間存放。
    • volatile-lru 嘗試回收最少使用的鍵(LRU),但僅限於在過期集合的鍵,使得新新增的資料有空間存放。
  • LFU - 沒碰多少次

對使用頻率最少(所有或有過期時間的)的key優先淘汰

    • allkeys-lfu 嘗試回收回收使用頻率最少的鍵(LFU),使得新新增的資料有空間存放。
    • volatile-lfu 嘗試回收使用頻率最少的鍵(LFU),但僅限於在過期集合的鍵,使得新新增的資料有空間存放。
    • volatile-ttl 對有過期時間的key中ttl最小的部分優先淘汰
    • noeviction 返回錯誤
    • allkeys-random: 回收隨機的鍵使得新新增的資料有空間存放。
    • volatile-random: 回收隨機的鍵使得新新增的資料有空間存放,但僅限於在過期集合的鍵。

    近似LRU演算法

    Redis的LRU演算法並非完整的實現。這意味著Redis並沒辦法選擇最佳候選來進行回收,也就是最久未被訪問的鍵。

    相反它會嘗試執行一個近似LRU的演算法,通過對少量keys進行取樣,然後回收其中一個最好的key(被訪問時間較早的)。

    Redis LRU有個很重要的點,你通過調整每次回收時檢查的取樣數量,以實現調整演算法的精度。這個引數可以通過以下的配置指令調整:

    
    maxmemory-samples 5
    
    @SvenAugustus (https://my.oschina.net/langxS...

    相關文章