redis內存淘汰機制,過期策略

目錄

問題1:我的數據明明都過期了,怎麼還佔用着內存啊?

問題剖析

(1)設置過期時間

(2)內存淘汰

手寫過期策略

redis如何刪除過期的key----總結!


問題1:我的數據明明都過期了,怎麼還佔用着內存啊?

如果你設置好了一個過期時間,你知道redis是怎麼給你弄成過期的嗎?什麼時候刪除掉?如果你不知道,之前有個學員就問了,爲啥好多數據明明應該過期了,結果發現redis內存佔用還是很高?那是因爲你不知道redis是怎麼刪除那些過期key的?

redis 內存一共是10g,你現在往裏面寫了5g的數據,結果這些數據明明你都設置了過期時間,要求這些數據1小時之後都會過期,結果1小時之後,你回來一看,redis機器,怎麼內存佔用還是50%呢?5g數據過期了,我從redis裏查,是查不到了,結果過期的數據還佔用着redis的內存。

問題剖析

(1)設置過期時間

我們set key的時候,都可以給一個expire time,就是過期時間,指定這個key比如說只能存活1個小時?10分鐘?這個很有用,我們自己可以指定緩存到期就失效。

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

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

定期刪除:每隔100ms隨機抽取設置了過期時間的key檢查是否過期(刪除);

惰性刪除:獲取key的時候redis檢查下是否過期,過期就刪除;
所謂定期刪除,指的是redis默認是每隔100ms就隨機抽取一些設置了過期時間的key,檢查其是否過期,如果過期就刪除。假設redis裏放了10萬個key,都設置了過期時間,你每隔幾百毫秒,就檢查10萬個key,那redis基本上就死了,cpu負載會很高的,消耗在你的檢查過期key上了。注意,這裏可不是每隔100ms就遍歷所有的設置過期時間的key,那樣就是一場性能上的災難。實際上redis是每隔100ms隨機抽取一些key來檢查和刪除的

但是問題是,定期刪除可能會導致很多過期key到了時間並沒有被刪除掉,那咋整呢?所以就是惰性刪除了。這就是說,在你獲取某個key的時候,redis會檢查一下 ,這個key如果設置了過期時間那麼是否過期了?如果過期了此時就會刪除,不會給你返回任何東西。

並不是key到時間就被刪除掉,而是你查詢這個key的時候,redis再懶惰的檢查一下通過上述兩種手段結合起來,保證過期的key一定會被幹掉。


很簡單 ,就是說,你的過期key,靠定期刪除沒有被刪除掉,還停留在內存裏,佔用着你的內存呢,除非你的系統去查一下那個key,纔會被redis給刪除掉。

但是實際上這還是有問題的,如果定期刪除漏掉了很多過期key,然後你也沒及時去查,也就沒 走惰性刪除,此時會怎麼樣?如果大量過期key堆積 在內存裏,導致redis內存 塊耗盡了,咋整?

答案是:走內存淘汰機制。


(2)內存淘汰

如果redis不足以容納新寫入數據的時候,此時會進行內存淘汰,有如下一些策略:

1. 新寫入操作會報錯。

2. 在鍵空間中,移除最近最少使用的key(這個是最常用的)。

3. 隨機移除某個key。

4. 在設置了過期時間的鍵空間中,移除最近最少使用的key。

5. 在設置了過期時間的鍵空間中,隨機移除某個key。

6. 在設置了過期時間的鍵空間 中,有 更早過期時間的key優先移除。

手寫過期策略

redis如何刪除過期的key----總結!

首先如果key過期了,redis並不會立馬刪除過期的key,而是經過兩個刪除策略:

1. redis默認100ms隨機抽取些設置了過期的key,查看是否過期如若過期則移除,(隨機是爲了保證redis效率,如果查看所有的key那麼redis壓力會非常大,吞吐量也就上不去了)

2. 如果策略1沒有刪除掉,還有策略2,就是在查詢設有過期key的時候,redis會默認查下是否過期,過期則移除;

但是以上兩個策略會出現大量過期而沒有刪除的數據(如:策略1沒隨機找到key,策略2又沒主動查詢key)

這時爲了能保證redis的正常運行,才引入的redis過期策略,從而保證不會因爲過多沒有清除掉的數據導致內存爆滿。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章