Redis過期鍵的刪除策略?
Redis的過期刪除策略就是:惰性刪除和定期刪除兩種策略配合使用。
惰性刪除:Redis的惰性刪除策略由db.c/expireIfNeeded函數實現,所有鍵讀寫命令執行之前都會調用 expireIfNeeded函數對其進行檢查,如果過期,則刪除該鍵,然后執行鍵不存在的操作;未過期則不作操作,繼續執行原有的命令。
定期刪除:由Redis.c/activeExpireCycle 函數實現,函數以一定的頻率運行,每次運行時,都從一定數量的數據庫中取出一定數量的隨機鍵進行檢查,并刪除其中的過期鍵。
附:刪除key常見的三種處理方式。
1、定時刪除
在設置某個key 的過期時間同時,我們創建一個定時器,讓定時器在該過期時間到來時,立即執行對其進行刪除的操作。
優點:定時刪除對內存是最友好的,能夠保存內存的key一旦過期就能立即從內存中刪除。
缺點:對CPU最不友好,在過期鍵比較多的時候,刪除過期鍵會占用一部分 CPU 時間,對服務器的響應時間和吞吐量造成影響。
2、惰性刪除
設置該key 過期時間后,我們不去管它,當需要該key時,我們在檢查其是否過期,如果過期,我們就刪掉它,反之返回該key。
優點:對 CPU友好,我們只會在使用該鍵時才會進行過期檢查,對于很多用不到的key不用浪費時間進行過期檢查。
缺點:對內存不友好,如果一個鍵已經過期,但是一直沒有使用,那么該鍵就會一直存在內存中,如果數據庫中有很多這種使用不到的過期鍵,這些鍵便永遠不會被刪除,內存永遠不會釋放。從而造成內存泄漏。
3、定期刪除
每隔一段時間,我們就對一些key進行檢查,刪除里面過期的key。
優點:可以通過限制刪除操作執行的時長和頻率來減少刪除操作對 CPU 的影響。另外定期刪除,也能有效釋放過期鍵占用的內存。
缺點:難以確定刪除操作執行的時長和頻率。如果執行的太頻繁,定期刪除策略變得和定時刪除策略一樣,對CPU不友好。如果執行的太少,那又和惰性刪除一樣了,過期鍵占用的內存不會及時得到釋放。另外最重要的是,在獲取某個鍵時,如果某個鍵的過期時間已經到了,但是還沒執行定期刪除,那么就會返回這個鍵的值,這是業務不能忍受的錯誤。
Redis內存淘汰機制?
當現有內存大于 maxmemory 時,便會觸發Redis主動淘汰內存方式,有如下幾種淘汰方式:
Redis 4.0前提供 6種數據淘汰策略:
volatile-lru:利用LRU算法移除設置過過期時間的key (LRU:最近使用 Least Recently Used )
allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key(這個是最常用的)
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-eviction:禁止驅逐數據,也就是說當內存不足以容納新寫入數據時,新寫入操作會報錯。這個應該沒人使用吧!
Redis 4.0后增加以下兩種:
volatile-lfu:從已設置過期時間的數據集(server.db[i].expires)中挑選最不經常使用的數據淘汰(LFU(Least Frequently Used)算法,也就是最頻繁被訪問的數據將來最有可能被訪問到)
allkeys-lfu:當內存不足以容納新寫入數據時,在鍵空間中,移除最不經常使用的key。
-
內存
+關注
關注
8文章
3028瀏覽量
74076 -
函數
+關注
關注
3文章
4332瀏覽量
62651 -
Redis
+關注
關注
0文章
376瀏覽量
10880
發布評論請先 登錄
相關推薦
評論