Redis的過期策略和記憶體淘汰機制

2022-03-01 15:54:12 字數 1594 閱讀 6349

我們set key的時候,都可以給乙個expire time,就是過期時間,指定這個key比如說只能存活1個小時,我們自己可以指定快取到期就失效。

如果假設你設定乙個一批key只能存活1個小時,那麼接下來1小時後,redis是怎麼對這批key進行刪除的?

答案是:定期刪除+惰性刪除

所謂定期刪除,指的是redis預設是每隔100ms就隨機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就刪除。

注意,這裡可不是每隔100ms就遍歷所有的設定過期時間的key,那樣就是一場效能上的災難。

實際上redis是每隔100ms隨機抽取一些key來檢查和刪除的。

但是,定期刪除可能會導致很多過期key到了時間並沒有被刪除掉,所以就得靠惰性刪除了。

這就是說,在你獲取某個key的時候,redis會檢查一下 ,這個key如果設定了過期時間那麼是否過期了?如果過期了此時就會刪除,不會給你返回任何東西。

並不是key到時間就被刪除掉,而是你查詢這個key的時候,redis再懶惰的檢查一下

通過上述兩種手段結合起來,保證過期的key一定會被乾掉。

如果大量過期key堆積在記憶體裡,導致redis記憶體塊耗盡了,怎麼辦?

答案是:走記憶體淘汰機制。

記憶體淘汰策略:

volatile-lru : 從已設定過期時間的資料集中挑選最近最少使用的資料淘汰。redis並不是保證取得所有資料集中最近最少使用的鍵值對,而只是隨機挑選的幾個鍵值對中的, 當記憶體達到限制的時候無法寫入非過期時間的資料集。

volatile-ttl: 從已設定過期時間的資料集中挑選將要過期的資料淘汰。redis 並不是保證取得所有資料集中最近將要過期的鍵值對,而只是隨機挑選的幾個鍵值對中的, 當記憶體達到限制的時候無法寫入非過期時間的資料集。

volatile-random: 從已設定過期時間的資料集中任意選擇資料淘汰。當記憶體達到限制的時候無法寫入非過期時間的資料集。

allkeys-lru: 從資料集中挑選最近最少使用的資料淘汰。當記憶體達到限制的時候,對所有資料集挑選最近最少使用的資料淘汰,可寫入新的資料集。

allkeys-random: 從資料集中任意選擇資料淘汰,當記憶體達到限制的時候,對所有資料集挑選隨機淘汰,可寫入新的資料集。

no-enviction: 當記憶體達到限制的時候,不淘汰任何資料,不可寫入任何資料集,所有引起申請記憶體的命令會報錯。

開啟記憶體淘汰

# maxmemory # maxmemory為0的時候表示我們對redis的記憶體使用沒有限制。

# maxmemory-policy noeviction # 根據應用場景,選擇淘汰策略

動態改配置命令

此外,redis支援動態改配置,無需重啟。

config set maxmemory 100000

#設定最大記憶體

config

set maxmemory-policy noeviction #設定淘汰策略

記憶體淘汰的過程

首先,客戶端發起了需要申請更多記憶體的命令(如set)。然後,redis檢查記憶體使用情況,如果已使用的記憶體大於maxmemory,則開始根據使用者配置不同的淘汰策略來淘汰記憶體(key),從而換取一定的記憶體。最後,如果上面都沒問題,則這個命令執行成功。

Redis的過期策略和記憶體淘汰策略

redis的過期策略 我們都知道,redis是key value資料庫,我們可以設定redis中快取的key的過期時間。redis的過期策略就是指當redis中快取的key過期了,redis如何處理。過期策略通常有以下三種 定時過期 每個設定過期時間的key都需要建立乙個定時器,到過期時間就會立即清...

Redis的過期策略和記憶體淘汰策略

在redis中我們對於鍵可以通過expire key time設定生存時間,當time時間過後鍵就會過期,redis會採用過期策略對過期的鍵進行刪除。過期策略主要是在cpu和記憶體之間進行權衡。可以將cpu的處理效率作為側重點進行選擇策略,也可以將記憶體的容量作為側重點進行選擇策略實際上redis採...

Redis的過期策略和記憶體淘汰策略

我們都知道,redis是key value資料庫,我們可以設定redis中快取的key的過期時間。redis的過期策略就是指當redis中快取的key過期了,redis如何處理。過期策略通常有以下三種 redis中同時使用了惰性過期和定期過期兩種過期策略。redis的記憶體淘汰策略是指在redis的...