記憶體管理
當 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/langxS...