2013-06-12 41 views
37

Redis是否可以爲特定的密鑰設置TTL(生存時間),而不是針對某個集合的成員?集合成員的TTL

我正在使用由Redis文檔提出的標籤結構 - 數據是簡單的鍵值對,標籤是包含與每個標籤對應的鍵的集合,例如,

> SETEX id:id_1 100 'Lorem ipsum' 
OK 
> SADD tag:tag_1 id:id_1 
(integer) 1 

關鍵id:id_1將到期的預期,但我沒有看到一個有效的辦法從tag:tag_1集中刪除相應的成員。

我想出的一種方法是使用包含腳本的cron作業,該腳本會定期從集合中刪除過期密鑰 - 將所有標籤名稱添加到另一個集合,然後遍歷所有標籤,然後遍歷所有標籤標記並檢查相應的密鑰是否存在 - 如果不存在,則調用SREM

我不認爲這將是一種有效的方式,我可能希望保持標籤儘可能乾淨,因爲這些集合的大小可能會影響通過多個標籤進行搜索的性能(SINTER)。有更多的「內部」方式嗎?

回答

15

無法直接過期列表,集合或zsets中的項目。

您需要實現一個機制,以便在主項目過期時得到通知,以便您可以相應地維護相應的集合。

看到這個問題的答案,我認爲它適用於你的使用情況(按標籤替代由ID會話和用戶):

Redis, session expiration, and reverse lookup

+0

是的,這是一個體面的方式,我可能會用類似的方式處理這個問題。既然標籤集合中過期成員的存在並不是以其他方式表現的問題,那麼我很可能會使用定期運行的cron而不是deamon--將投票數限制在足夠的最小值。 – Przemek

20

不,這是不可能的(和not planned either )。 recommended方法是使用一個有序集,並將分數設置爲時間戳,然後手動刪除過期的密鑰。要查詢未過期的密鑰,您可以使用ZRANGEBYSCORE $now +inf來刪除過期的密鑰,ZREMRANGEBYSCORE -inf $now將會執行此操作。

在我的應用程序中,每次查詢集合時我都會簡單地發出這兩個命令。我還將這與(set)本身的(很長)到期時間結合起來,以最終清除未使用的集合。

This article更詳細地通過它。