redis常用於有時間限制的資料儲存,可以在set key的時候給乙個expire time(過期時間),通過設定過期時間可以指定這個key可以存活的時間,那麼設定的過期時間到了後,redis是怎麼對過期的key進行刪除的呢?下面分別從redis過期策略和記憶體淘汰機制說起
定期刪除
redis預設每隔100ms就會隨機抽取一些設定了過期時間的key,檢查是否過期,如果過期就刪除該key,注意是隨機抽取一些key,這是因為與cpu的負載有關,假設redis中的過期資料量十分龐大,每隔100ms就遍歷所有的過期key的話,就會給cpu帶來很大的負載。
定期刪除策略可能會導致很多過期的key到了時間並沒有被刪除,這時就需要用到惰性刪除策略了
惰性刪除
假如key過期了,而定期刪除策略沒有將其刪除掉,這個過期的key還停留在記憶體中,此時系統查詢一下那個過期的key,redis就會將這個過期的key給刪除掉。
redis記憶體淘汰機制有以下幾種:
volatile-lru:從已設定過期時間的資料集中挑選最近最少使用的資料淘汰
volatile-ttl:從已設定過期時間的資料集中挑選將要過期的資料淘汰
volatile-random:從已設定過期時間的資料集中任意選擇資料淘汰
allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key(常用)
allkeys-random:從資料集中任意選擇資料淘汰
no-eviction:禁止驅逐資料,及當記憶體不足以容納新寫入資料時,新寫入操作會報錯
volatile-lfu:從已設定過期時間的資料集中挑選最不經常使用的資料淘汰
allkeys-lfu:當記憶體不足以容納新寫入的資料時,移除最不經常使用的key
通過配置redis.conf中的maxmemory引數值來開啟淘汰功能,設定最大記憶體,通過maxmemory-policy引數值配置淘汰策略
lru演算法的實現:
通過雙向鍊錶來實現,新資料插入到鍊錶頭部,每當快取資料被訪問,則將資料移到鍊錶頭部,當鍊表滿時,將鍊錶尾部的資料丟棄。
new linkedhashmap(capacity, default_load_factory, true);
第三個引數為true,代表按訪問順序排序,可作為lru快取;設為false,代表按插入順序排序,可作為fifo快取
redis中通過expire命令或pexpire命令設定以秒或毫秒精度的生存時間(time to live,ttl),通過expireat命令或pexpireat命令設定以秒或毫秒精度的過期時間(expire time)
expire :用於將key的生存時間設定為ttl秒
pexpire :用於將key的生存時間設定為ttl毫秒
expireat :用於將key的過期時間設定為timestamp所指定的秒數時間戳
pexpireat :用於將key的過期時間設定為timestamp所指定的毫秒數時間戳
Redis記憶體管理 鍵過期策略 記憶體淘汰策略
記憶體使用統計指標 可以參考文章 其中需要重點關注的指標 used memory redis使用的記憶體總量 used memory rss 系統分配的記憶體總量 mem fragmentation ratio 記憶體碎片率 used memory rss used memory 當 mem fra...
Redis的過期策略和記憶體淘汰策略
redis的過期策略 我們都知道,redis是key value資料庫,我們可以設定redis中快取的key的過期時間。redis的過期策略就是指當redis中快取的key過期了,redis如何處理。過期策略通常有以下三種 定時過期 每個設定過期時間的key都需要建立乙個定時器,到過期時間就會立即清...
Redis的過期策略和記憶體淘汰策略
在redis中我們對於鍵可以通過expire key time設定生存時間,當time時間過後鍵就會過期,redis會採用過期策略對過期的鍵進行刪除。過期策略主要是在cpu和記憶體之間進行權衡。可以將cpu的處理效率作為側重點進行選擇策略,也可以將記憶體的容量作為側重點進行選擇策略實際上redis採...