http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru cache.html 記憶體管理 當 Redis 作為緩存使用時(此時緩存僅作為熱點數據提高服務的訪問性能),需要考慮記憶體的限制,以及如何隨著業務的增長,僅保 ...
記憶體管理
當 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會被髮現並主動的過期。
- 主動
當然,這樣是不夠的,因為有些過期的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/langxSpirit)