redis過期策略與記憶體淘汰機制總結

2021-10-09 13:52:50 字數 1616 閱讀 8102

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採...