先來(lái)回顧一下Redis鍵的生存時(shí)間,過(guò)期時(shí)間的設(shè)置;然后會(huì)講到過(guò)期鍵刪除策略;然后會(huì)聊其他功能對(duì)過(guò)期鍵的處理。
2.鍵的生存時(shí)間
鍵過(guò)期時(shí)間設(shè)置通過(guò)Expire命令或者Pexpire命令,客戶端可以以毫秒級(jí)的精度為數(shù)據(jù)庫(kù)中的某個(gè)鍵設(shè)置生存時(shí)間,一段時(shí)間后Redis服務(wù)器會(huì)刪除生存時(shí)間為0的鍵。下面我們看一下Redis鍵的過(guò)期時(shí)間設(shè)置,以及查詢鍵剩余壽命。
EXPIRE key 5 #設(shè)置一個(gè)鍵的過(guò)期時(shí)間 單位秒
EXPIREAT KEY 1660753861 #設(shè)置過(guò)期時(shí)間某個(gè)時(shí)間戳過(guò)期(UNIX時(shí)間戳)單位秒
PEXPIRE key 33 #設(shè)置一個(gè)鍵的過(guò)期時(shí)間 單位毫秒
PEXPIREAT key 1660839534000 #設(shè)置過(guò)期時(shí)間某個(gè)時(shí)間戳過(guò)期(UNIX時(shí)間戳)單位毫秒
TTL key # 返回鍵的剩余過(guò)期時(shí)長(zhǎng),單位秒
PTTL key # 返回鍵的剩余過(guò)期時(shí)長(zhǎng),單位毫秒
Redis中的這些鍵的過(guò)期時(shí)間如何保存
Redis中維護(hù)了一個(gè)過(guò)期字典。其數(shù)據(jù)結(jié)構(gòu)中,字典的鍵是一個(gè)指針,指向某個(gè)數(shù)據(jù)庫(kù)鍵,而字典的鍵值則是一個(gè)long類型的整數(shù),表示一個(gè)毫秒精度的UNIX時(shí)間戳。
其實(shí)上面幾種設(shè)置鍵過(guò)期時(shí)間的命令相當(dāng)于最后都是調(diào)用 PEXPIREAT 這個(gè)命令。
3.鍵的過(guò)期刪除策略
3.1 如何判定鍵過(guò)期
Redis中判斷鍵是否過(guò)期會(huì)使用以下的方法
- 檢查給定的鍵是否存在于過(guò)期字典,如果存在則獲取鍵的過(guò)期時(shí)間
- 檢查當(dāng)前的UNIX時(shí)間戳是否大于鍵的過(guò)期時(shí)間戳,大于過(guò)期時(shí)間戳的話則判定鍵過(guò)期
3.2 三種過(guò)期鍵刪除策略
常見刪除策略有三種:定時(shí)刪除、惰性刪除、定期刪除
3.2.1定時(shí)刪除
定時(shí)刪除是在設(shè)置鍵的過(guò)期時(shí)間時(shí),設(shè)置一個(gè)定時(shí)器,定時(shí)器會(huì)在鍵的過(guò)期時(shí)間到來(lái)時(shí)立即刪除鍵
- 優(yōu)點(diǎn):內(nèi)存友好,可以保證過(guò)期鍵盡可能快速地被刪除,釋放內(nèi)存。
- 缺點(diǎn):CPU資源分配不友好,如果過(guò)期鍵比較多的時(shí)候,此時(shí)刪除會(huì)占用大量的CPU資源,從而間接影響Redis的性能。
3.2.2惰性刪除
惰性刪除只會(huì)在程序需要使用鍵時(shí),才會(huì)對(duì)當(dāng)前鍵進(jìn)行過(guò)期檢查,而不會(huì)去刪除其他的過(guò)期鍵。
- 優(yōu)點(diǎn):CPU資源耗費(fèi)小,因?yàn)橹皇窃谌〕鲦I的時(shí)候才會(huì)做過(guò)期檢查,并刪除等操作。
- 缺點(diǎn):過(guò)期鍵會(huì)占用內(nèi)存,如果一個(gè)過(guò)期鍵永遠(yuǎn)不被使用,那么就永遠(yuǎn)不能被刪除,會(huì)造成內(nèi)存泄漏。
惰性刪除執(zhí)行步驟如下:
- 執(zhí)行讀寫命令時(shí)去檢查鍵的過(guò)期時(shí)間
- 如果鍵過(guò)期,刪除鍵,整個(gè)流程會(huì)按照鍵不存在的情況處理
- 如果鍵未過(guò)期,則按照鍵存在的情況執(zhí)行命令
3.2.3定期刪除
定期刪除是每隔一段時(shí)間執(zhí)行一次過(guò)期鍵刪除操作,可以通過(guò)限制刪除的操作執(zhí)行的時(shí)長(zhǎng)和頻率來(lái)減少CPU資源占用。同時(shí)定期刪除策略不會(huì)導(dǎo)致過(guò)期鍵過(guò)多的堆積,造成大量?jī)?nèi)存泄漏。
定期刪除策略有兩個(gè)點(diǎn)比較重要,執(zhí)行時(shí)長(zhǎng)和執(zhí)行頻率。需要兩者結(jié)合才能達(dá)到最優(yōu)的效果。
定期刪除步驟:
- 從設(shè)置過(guò)期時(shí)間的key的集合中隨機(jī)檢查20個(gè)key
- 刪除其中的過(guò)期鍵。如果檢查結(jié)果中25%以上的key過(guò)期,則開始新一輪任務(wù)。
- 每次會(huì)按順序在每個(gè)數(shù)據(jù)庫(kù)執(zhí)行,如果在3號(hào)數(shù)據(jù)庫(kù)返回,則會(huì)記錄下來(lái),下次刪除操作執(zhí)行的時(shí)候會(huì)從4號(hào)數(shù)據(jù)庫(kù)開始,就這樣循環(huán)遍歷整個(gè)Redis數(shù)據(jù)庫(kù)。
定期任務(wù)執(zhí)行頻率:
為了定期檢測(cè)資源和服務(wù)狀態(tài)并根據(jù)預(yù)定策略執(zhí)行相應(yīng)的操作,Redis會(huì)調(diào)用內(nèi)部函數(shù)來(lái)執(zhí)行多種后臺(tái)任務(wù)。
其執(zhí)行頻率由hz參數(shù)指定,默認(rèn)為10,即每秒執(zhí)行10次。
image-20220821131302978
這個(gè)值可以設(shè)置1-500,但是官方建議設(shè)置100以下,設(shè)置過(guò)大會(huì)造成CPU資源占用過(guò)大。基本上只用默認(rèn)值就能滿足大部分需求。
4.其他功能對(duì)過(guò)期鍵的處理
Redis數(shù)據(jù)保存有AOF和RDB兩種功能。對(duì)于過(guò)期鍵的處理也不相同。
RDB持久化對(duì)過(guò)期鍵的處理:
- 生成RDB文件時(shí)。 過(guò)期key會(huì)被忽略,從而不會(huì)被保存到RDB文件中
- 加載RDB文件。
- 主服務(wù)器模式。載入RDB文件時(shí),會(huì)對(duì)key的過(guò)期時(shí)間進(jìn)行檢查,過(guò)期鍵會(huì)被忽略,不會(huì)加載到Redis中
- 從服務(wù)器模式。所有數(shù)據(jù)key都會(huì)加載到Redis中
AOF持久化對(duì)過(guò)期鍵的處理:
- AOF文件寫入的時(shí)候,會(huì)append刪除語(yǔ)句, DEL key 。
- AOF重寫的時(shí)候過(guò)期key則不會(huì)被寫入AOF文件中。
當(dāng)Redis服務(wù)器處于復(fù)制模式時(shí)對(duì)過(guò)期鍵的處理:
- 主服務(wù)器刪除key時(shí),會(huì)向從服務(wù)器發(fā)送DEL命令
- 從服務(wù)器不會(huì)處理過(guò)期key
- 從服務(wù)器只有接到Master發(fā)送的DEL命令才會(huì)刪除key
總結(jié)
Redis的過(guò)期策略采用惰性刪除和定期刪除兩種組合方式,其中惰性刪除保證過(guò)期鍵一點(diǎn)過(guò)不會(huì)被使用,定期刪除可以保證過(guò)期數(shù)據(jù)得到釋放,優(yōu)化資源占用率。
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9303瀏覽量
86061 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115371 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3846瀏覽量
64685 -
Redis
+關(guān)注
關(guān)注
0文章
378瀏覽量
10942
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論