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

Redis持久化機制的實現(xiàn)原理和使用技巧
redis緩存滿了怎么辦?

Redis 的數(shù)據(jù)清理策略

Redis持久化機制介紹

Redis 如何刪除數(shù)據(jù)
為什么使用top命令時,Redis還是占了很多內(nèi)存?

評論