?
This document uses PHP Chinese website manual Release
EXPIRE key seconds
自1.0.0起可用。
時間復(fù)雜度: O(1)
設(shè)置超時key
。超時過期后,密鑰將自動刪除。在 Redis 術(shù)語中,有關(guān)聯(lián)超時的密鑰通常被認(rèn)為是不穩(wěn)定的。
超時只能通過刪除或覆蓋密鑰內(nèi)容的命令清除,包括 DEL,SET,GETSET 和所有*STORE
命令。這意味著所有在概念上改變存儲在密鑰中的值而不用新密鑰替換的操作都會使超時保持不變。例如,使用 INCR 增加一個鍵的值,用 LPUSH 將一個新值推入一個列表,或者用 HSET 改變一個散列的字段值都是會使超時保持不變的操作。
超時也可以被清除,使用 PERSIST 命令將密鑰恢復(fù)為持久密鑰。
如果使用 RENAME 重命名密鑰,則相關(guān)的生存時間將轉(zhuǎn)移到新的密鑰名稱。
如果某個密鑰被 RENAME 覆蓋,就像現(xiàn)有密鑰Key_A
被類似的調(diào)用覆蓋的情況一樣RENAME Key_B Key_A
,原始的密碼是否與Key_A
超時相關(guān)并不重要,新密鑰Key_A
將繼承所有的特性Key_B
。
請注意,以非積極的超時或 EXPIREAT / PEXPIREAT 調(diào)用帶有過去時間的 EXPIRE / PEXPIRE 將導(dǎo)致密鑰被刪除而不是過期(相應(yīng)地,發(fā)出的關(guān)鍵事件將del
不會expired
)。
可以使用一個已經(jīng)存在過期集的鍵作為參數(shù)來調(diào)用 EXPIRE。在這種情況下,密鑰的生存時間會更新為新值。有很多有用的應(yīng)用程序,下面的導(dǎo)航會話模式部分介紹了一個示例。
在2.1.3之前的 Redis 版本中,使用改變其值的命令更改具有過期集合的密鑰具有完全移除密鑰的效果。這種語義是需要的,因為現(xiàn)在已經(jīng)修復(fù)了復(fù)制層的限制。
EXPIRE 將返回0,并且不會更改設(shè)置了超時的密鑰的超時。
整數(shù)回復(fù),具體為:
1
如果超時被設(shè)置。
0
如果key
不存在。
redis> SET mykey "Hello" "OK"
redis> EXPIRE mykey 10 (integer) 1
redis> TTL mykey (integer) 10
redis> SET mykey "Hello World" "OK"
redis> TTL mykey (integer) -1
想象一下你有一個網(wǎng)絡(luò)服務(wù),并且你對用戶最近訪問過的最近N個網(wǎng)頁感興趣,這樣每個相鄰的網(wǎng)頁瀏覽都不會在前一個網(wǎng)頁中執(zhí)行超過60秒。從概念上講,您可以將這組頁面視為用戶的導(dǎo)航會話,可能包含有關(guān)他或她當(dāng)前正在查找的產(chǎn)品的有趣信息,以便推薦相關(guān)產(chǎn)品。
您可以使用以下策略輕松在 Redis 中對此模式進行建模:每次用戶執(zhí)行頁面視圖時,都會調(diào)用以下命令:
MULTI RPUSH pagewviews.user:<userid> http://.....EXPIRE pagewviews.user:<userid> 60EXEC
如果用戶空閑時間超過60秒,則該鍵將被刪除,并且只有小于60秒的后續(xù)頁面查看才會被記錄下來。
這種模式很容易修改為使用 INCR 而不是使用 RPUSH 的列表。
通常情況下,Redis 密鑰創(chuàng)建時沒有關(guān)聯(lián)的生存時間。除非用戶以明確的方式刪除密鑰,例如使用 DEL 命令,否則密鑰將永遠存在。
EXPIRE 系列命令能夠?qū)⑦^期與給定密鑰相關(guān)聯(lián),但需要使用密鑰所使用的一些額外內(nèi)存。當(dāng)密鑰設(shè)置過期時,Redis 將確保在指定的時間量過去時移除密鑰。
使用 EXPIRE 和 PERSIST 命令(或其他嚴(yán)格相關(guān)的命令)可以更新或完全刪除生存的關(guān)鍵時刻。
在 Redis 2.4中,expire 可能不是精確的,它可能在0到1秒之間。
由于 Redis 2.6 的過期錯誤是從0到1毫秒。
密鑰過期信息存儲為絕對 Unix 時間戳(Redis 版本2.6或更高版本以毫秒為單位)。這意味著即使 Redis 實例未處于活動狀態(tài),時間仍在流動。
為了過期工作,電腦的時間必須保持穩(wěn)定。如果您從兩臺計算機中移動一個RDB文件并在其時鐘中執(zhí)行大的異步操作,可能會發(fā)生有趣的事情(例如加載時所有加載的密鑰都會過期)。
即使正在運行的實例也會檢查計算機時鐘,因此,例如,如果您設(shè)置的密鑰的生存時間為1000秒,然后將計算機的時間設(shè)置為將來2000秒,密鑰將立即過期,而不是持續(xù)1000秒。
Redis 密鑰有兩種過期方式:被動方式和主動方式。
當(dāng)某個客戶端試圖訪問密鑰時,密鑰被動地過期,并且發(fā)現(xiàn)密鑰超時。
當(dāng)然這還不夠,因為有過期的密鑰永遠不會被再次訪問。無論如何,這些密鑰應(yīng)該過期,因此 Redis 會定期在密鑰中隨機測試幾個密鑰并設(shè)置過期。所有已過期的密鑰都將從密鑰空間中刪除。
具體來說,這是 Redis 每秒執(zhí)行10次的操作:
從關(guān)鍵集合中檢測20個隨機關(guān)鍵字并帶有關(guān)聯(lián)的過期。
刪除所有過期的密鑰。
如果超過25%的密鑰過期,請從第1步重新開始。
這是一個微不足道的概率算法,基本上假設(shè)是我們的樣本代表了整個密鑰空間,并且我們繼續(xù)過期直到可能過期的密鑰的百分比低于25%
這意味著在任何給定時刻,已經(jīng)過期的使用存儲器的最大密鑰數(shù)量最多等于每秒寫入操作的最大數(shù)量除以4。
為了在不犧牲一致性的情況下獲得正確的行為,當(dāng)密鑰過期時,將在 AOF 文件中合成一個 DEL 操作并獲取所有連接的從站。這樣,到期過程集中在主實例中,并且不存在一致性錯誤的可能性。
然而,雖然連接到主服務(wù)器的從服務(wù)器不會獨立使用密鑰(但會等待來自主服務(wù)器的 DEL),但它們?nèi)詴捎脭?shù)據(jù)集中存在的已滿過期的完整狀態(tài),因此,當(dāng)從服務(wù)器選擇為掌握它將能夠獨立過期,完全充當(dāng)主人。