Redis 過時時間與內存管理

內存管理

當 Redis 做爲緩存使用時(此時緩存僅做爲熱點數據提升服務的訪問性能),須要考慮內存的限制,以及如何隨着業務的增加,僅保留熱點數據。html

file

過時時間

Redis 全部的數據結構均可以設置過時時間,時間到了,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會被發現並主動的過時。shell

  • 主動

固然,這樣是不夠的,由於有些過時的keys,永遠不會訪問他們。緩存

不管如何,這些keys應該過時,因此定時隨機測試設置keys的過時時間。全部這些過時的keys將會從密鑰空間刪除。數據結構

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

  • 1.測試隨機的20個keys進行相關過時檢測。
  • 2.刪除全部已通過期的keys。
  • 3.若是有多於25%的keys過時,重複步奏1.
    這是一個平凡的機率算法,基本上的假設是,咱們的樣本是這個密鑰控件,

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

內存淘汰

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

maxmemory 100mb
maxmemory-policy [策略]

淘汰策略:.net

  • 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/langxSpirit)

相關文章
相關標籤/搜索