redis过期策略和淘汰机制你知道多少?
關注微信公眾號“蝦米聊吧”,每天更新一篇技術文章,文章內容涵蓋架構師成長必經之路應掌握的技術,一起學習,一起交流。
?
開篇提問:你是否遇到過生產環境redis丟數據的問題?比如你剛剛寫入了一堆數據到redis,然后過了一會就沒了,那么這是什么原因造成的呢?接下來我們簡單探討一下這個問題。
?
首先要明確一點,redis是用來做緩存的并不是用來做常規存儲的,千萬不要什么數據都一股腦往里面丟,畢竟內存是很寶貴而有限的資源,不比磁盤,磁盤是非常廉價的。一臺服務器可能內存就幾十個G,但是卻有幾個T的磁盤空間。redis主要是基于內存操作的,用來提高高并發下的讀寫操作性能。
?
因為內存是有限的所以,如果你寫入的數據超出了redis可用內存的大小,那么redis會基于LRU算法清理掉部分數據,舉個例子,如果設置了你的redis是可以使用16G內存,你要是往里面寫了20G數據。那么自然會清理掉4G數據,然后保留16G數據,清理掉的數據通常是不常使用的,然后保留常用數據。
因此,redis中的數據是會過期的,要么是你自己設置了過期時間,要么是redis自己給清理掉了。
說到這里,那么問題來了,redis具體是怎么清理掉我們設置了過期時間的數據的呢?因為有時候你在監控內存的時候可能會發現,明明好多數據都設置了過期時間,但是redis的內存依然占用很高,這個時候你可能就會撓撓頭一臉懵逼了,那么接下來我們將簡單探討一下具體redis是怎么刪除那些過期key的。
因為如果不清楚redis的清理刪除機制,可能會導致在高并發的場景中,redis沒有有效的提升系統的性能,還有可能導致其他的問題。
redis刪除清理key的一般有如下兩種情況:(1)對設置過期時間redis的進行刪除(2)通過內存淘汰機制刪除部分key;下面我們對這兩種情況的原理分別進行探討。
?
01? 設置過期時間redis的清理機制
?
redis中對某一個key設置過期時間相信我們再熟悉不過了,因為我們只要在set key的時候,就可以給一個expire time,就是過期時間,指定這個key多久后過期,到達過期時間后緩存就會失效。
那么具體redis是怎么刪除我們這些已經過期的key的呢?
答案是:定期刪除+惰性刪除
?
所謂定期刪除,指的是redis默認是每隔100ms就隨機抽取一些設置了過期時間的key,檢查其是否過期,如果過期就刪除。注意,這里并不是每隔100ms就遍歷所有的設置過期時間的key,因為如果是遍歷檢測所有設置過期時間的key的話那你的redis基本就掛了。簡單做個比喻說明:假設redis里存放了100萬個key,都設置了過期時間,你每隔幾百毫秒,就檢查這100萬個key,那么很不幸你的redis基本上就死了,因為cpu的負載全消耗在你檢查過期key上了。實際上redis是每隔100ms隨機抽取一些key來檢查和刪除的。
?
但是隨機抽取一些key的話又會造成另一個問題: 可能會出現很多過期key到了時間并沒有被刪除掉,因為隨機抽取的時候并沒有抽取到,那redis又是怎么解決這個問題的呢?答案就是惰性刪除。惰性刪除的意思就是,在你獲取某個key的時候,redis會檢查一下 ,這個key是否設置了過期時間,如果設置了過期時間那么是否過期了?如果過期了此時就會刪除該key,并不會給你返回任何東西。因此要注意并不是key到時間就會被刪除掉,而是你查詢這個key的時候,redis再懶惰的檢查一下
redis就是通過上述兩種手段結合起來,以確保過期的key一定會被刪除掉。
簡單來說就是你設置的過期key,如果通過定期刪除沒有被刪除掉,就仍然會停留在內存里,占用著你的內存,這個時候只有你的系統去主動查一下那個key,才會被redis給刪除掉。
但是實際上經過以上的處理機制后,如果定期刪除漏掉了很多過期key的話,然后你也沒及時去查,也就沒走惰性刪除,就會造成大量過期key堆積在內存里,最終仍然可能會導致redis內存耗盡,因此這個問題又該怎么解決呢?
答案是:走內存淘汰策略。
?
02?內存淘汰策略
?
當redis的內存占用過多或者快達到redis可用內存上限一定比例的時候,此時會觸發redis內存淘汰策略,具體有如下一些策略:
1)noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯,這個一般沒人用
2)allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key(這個是最常用的)
3)allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key,這個一般也沒人用
4)volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的key(這個一般不太合適)
5)volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個key
6)volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的key優先移除
?
注:一般都是采用第二種策略allkeys-lru,因為刪除最近最少使用key基本符合我們的業務要求
?
關注微信公眾號“蝦米聊吧”,獲取更多知識資料干貨~,一起交流,一起學習~,
一起打卡學習,一起交流進步吧!
微信掃描二維碼,關注我的公眾號
總結
以上是生活随笔為你收集整理的redis过期策略和淘汰机制你知道多少?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows pdf补丁丁如何制作书签
- 下一篇: redis缓存穿透、缓存雪崩、缓存击穿、