內(nèi)存管理
當(dāng) Redis 作為緩存使用時(此時緩存僅作為熱點數(shù)據(jù)提高服務(wù)的訪問性能),,需要考慮內(nèi)存的限制,以及如何隨著業(yè)務(wù)的增長,,僅保留熱點數(shù)據(jù),。
過期時間
Redis 所有的數(shù)據(jù)結(jié)構(gòu)都可以設(shè)置過期時間,,時間到了,Redis 會自動刪除相應(yīng)的對象,。
需要注意的:
- 過期
expire 是以對象為單位,,比如一個 hash 結(jié)構(gòu)的過期是整個 hash 對象的過期,而不是其中的某個子 key,。
- 如果一個字符串已經(jīng)設(shè)置了過期時間,,然后你調(diào)用了 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過期有兩種方式:被動和主動方式,。
當(dāng)一些客戶端嘗試訪問它時,key會被發(fā)現(xiàn)并主動的過期,。
當(dāng)然,,這樣是不夠的,因為有些過期的keys,,永遠不會訪問他們,。
無論如何,這些keys應(yīng)該過期,,所以定時隨機測試設(shè)置keys的過期時間,。所有這些過期的keys將會從密鑰空間刪除。
具體就是Redis每秒10次做的事情:
- 1.測試隨機的20個keys進行相關(guān)過期檢測,。
- 2.刪除所有已經(jīng)過期的keys,。
- 3.如果有多于25%的keys過期,重復(fù)步奏1.
這是一個平凡的概率算法,,基本上的假設(shè)是,,我們的樣本是這個密鑰控件,
并且我們不斷重復(fù)過期檢測,,直到過期的keys的百分百低于25%,這意味著,,在任何給定的時刻,最多會清除1/4的過期keys,。
內(nèi)存淘汰
在 redis.conf 或 使用 CONFIG 命令配置 Redis的配置項:
maxmemory 100mb
maxmemory-policy [策略]
淘汰策略:
對最近很少使用(所有或有過期時間的)的key優(yōu)先淘汰
allkeys-lru 嘗試回收最少使用的鍵(LRU),,使得新添加的數(shù)據(jù)有空間存放。
volatile-lru 嘗試回收最少使用的鍵(LRU),,但僅限于在過期集合的鍵,使得新添加的數(shù)據(jù)有空間存放,。
LFU - 沒碰多少次
對使用頻率最少(所有或有過期時間的)的key優(yōu)先淘汰
-
allkeys-lfu 嘗試回收回收使用頻率最少的鍵(LFU),使得新添加的數(shù)據(jù)有空間存放,。
-
volatile-lfu 嘗試回收使用頻率最少的鍵(LFU),,但僅限于在過期集合的鍵,使得新添加的數(shù)據(jù)有空間存放。
-
volatile-ttl 對有過期時間的key中ttl最小的部分優(yōu)先淘汰
-
noeviction 返回錯誤
-
allkeys-random: 回收隨機的鍵使得新添加的數(shù)據(jù)有空間存放。
-
volatile-random: 回收隨機的鍵使得新添加的數(shù)據(jù)有空間存放,,但僅限于在過期集合的鍵,。
近似LRU算法
Redis的LRU算法并非完整的實現(xiàn)。這意味著Redis并沒辦法選擇最佳候選來進行回收,,也就是最久未被訪問的鍵,。
相反它會嘗試運行一個近似LRU的算法,通過對少量keys進行取樣,,然后回收其中一個最好的key(被訪問時間較早的),。
Redis LRU有個很重要的點,你通過調(diào)整每次回收時檢查的采樣數(shù)量,,以實現(xiàn)調(diào)整算法的精度,。這個參數(shù)可以通過以下的配置指令調(diào)整:
maxmemory-samples 5
@SvenAugustus (https://my.oschina.net/langxSpirit)
|