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