Redis的過期策略有哪些?內存淘汰機制都有哪些?

問題起因

公司同學之前問了一個問題,說我們生產環境中怎麼經常會丟一些數據?寫進去,過一會可能就沒了。我驚訝了一下,同學,你問這個問題說明redis你沒用對呀。redis是緩存 你可能當存儲了吧。

什麼是緩存

用內存當緩存,內存是無限的麼,內存空間是很寶貴而且是有限的,磁盤是廉價而且是大量的。可能一臺機器就幾十個g的內存,但是可以有幾T的磁盤空間。redis主要是基於內存來進行高性能,高併發的讀寫操作的。
那麼既然內存是有限的,比如redis就只能用10個g,你要是往裏面寫20個g的數據,會咋辦?當然是幹掉10個g的數據,然後就保留10個g的數據了,那幹掉那些數據?保留那些數據?當然是保留常用的數據,幹掉不常用的數據了
所以說,這是一個緩存最基本的概念了,數據會過期的,要麼是你自己設置個過期時間,要麼是redis自己給幹掉。
set key value(1 小時)
set進去的key 1個小時之後就沒了,就失效了。

我的數據明明都過期了,怎麼還佔着內存

還有一種就是如果你設置好了一個過期時間,你知道rdis是怎麼給你弄成過期的麼?什麼時候刪掉?如果你不知道,之前有個同學問過了爲啥好多數據明明應該過期了,結果redis的內存佔用還是很高?那是因爲你不知道redis是如何刪除那些過期的key的。
redis內存一共是10g的內存,你現在往裏面寫了5g的數據,結果這些數據明明你都設置了過期時間,要求這些數據一小時之後過期結果一小時以後你回來一看redis機器 怎麼內存佔用還是50%呢?5g數據過期了,我從redis裏面查,是查不到了,,結果過期的數據還佔用這redis的內存

解決方案

1)設置過期時間
我們set key的時候 都可以給一個expire time,就是過期時間,指定這個key比如說還能存活 1小時 ?10分鐘?這個很有用,我們自己可以指定緩存到期就失效。
如果你設置一個一批key只能存活一小時,那麼接下里一個小時以後 redis是怎麼對這批key進行刪除的。
這裏採用的是定期刪除+惰性刪除的方式

什麼是定期刪除 和 惰性刪除

所謂定期刪除,指的是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內存塊耗盡了咋整?
**解決方案 走內存淘汰機制

內存淘汰

如果redis內存佔用過多的時候,此時會進行內存淘汰,有如下一些策略
redis10個key 現在已經滿了redis 需要刪除掉5個key
**
1個key最近1分鐘被查詢了100次
1個key最近10分鐘被查詢了50次
1個key最近1個小時被查詢了1次
**
1)noeviction:當內存不足以容納新寫入的數據時,新寫入操作會報錯(這個一般不怎麼用)
2)allkeys-lru:當內存不足以容納新寫入的數據時,在鍵空間中,移除最近最少使用的key(這個常用)
3)allkeys-random:當內存不足以容納新寫入的數據時,在鍵空間中,隨機移除某個key (這個一般不怎麼用)
4)volatile-lru:當內存不足以容納新寫入的數據時,在設置了過期時間的鍵空間中,移除最近最少使用的key (這個一般不用)
5)volatile-random:當內存不足以容納新寫入的數據時,在設置了過期時間的鍵空間中,隨機移除某個key
6)volatile-ttl:當內存不足以容納新寫入的數據時,在鍵空間中,有更早過期時間的key優先移除。

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