當 Redis 做爲緩存使用時(此時緩存僅做爲熱點數據提升服務的訪問性能),須要考慮內存的限制,以及如何隨着業務的增加,僅保留熱點數據。html
Redis 全部的數據結構均可以設置過時時間,時間到了,Redis 會自動刪除相應的對象。
須要注意的:redis
expire
是以對象爲單位,好比一個 hash 結構的過時是整個 hash 對象的過時,而不是其中的某個子 key。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...
Redis keys過時有兩種方式:被動和主動方式。算法
當一些客戶端嘗試訪問它時,key會被發現並主動的過時。shell
固然,這樣是不夠的,由於有些過時的keys,永遠不會訪問他們。緩存
不管如何,這些keys應該過時,因此定時隨機測試設置keys的過時時間。全部這些過時的keys將會從密鑰空間刪除。數據結構
具體就是Redis每秒10次作的事情:dom
而且咱們不斷重複過時檢測,直到過時的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: 回收隨機的鍵使得新添加的數據有空間存放,但僅限於在過時集合的鍵。
Redis的LRU算法並不是完整的實現。這意味着Redis並沒辦法選擇最佳候選來進行回收,也就是最久未被訪問的鍵。
相反它會嘗試運行一個近似LRU的算法,經過對少許keys進行取樣,而後回收其中一個最好的key(被訪問時間較早的)。
Redis LRU有個很重要的點,你經過調整每次回收時檢查的採樣數量,以實現調整算法的精度。這個參數能夠經過如下的配置指令調整:
maxmemory-samples 5
@SvenAugustus (https://my.oschina.net/langxSpirit)