Eli鏈接的功能允許您在密鑰過期時收聽。但是,它不會給你鑰匙的價值。此外,基於提交的github問題,它看起來並不像您期望在任何時候即將建立此功能(https://github.com/antirez/redis/issues/1876)。我使用的解決方案是創建一個特殊的「影子」到期密鑰,該密鑰鏈接到您具有實際值的密鑰。
因此可以說你有一個叫做testkey
的鍵,它的整數值爲100
。此外,密鑰將在10秒後過期,此時您想獲取密鑰的值。 (也許你在10秒內遞增密鑰)。
首先,您需要設置偵聽keyspace事件。特別是你想聽聽expired
事件。您可以從您的配置中執行此操作,或在redis中使用config set
命令。 (在這裏看到更多的信息:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
現在,您可以訂閱一個特殊的keyevent
通道里,你會被通知已過期。
SUBSCRIBE [email protected]__:expired
要訂閱的頻道格式爲[email protected]<db>__:<eventName>
。在我們的例子中,我們假設我們正在使用默認數據庫0,並且我們要監聽expired
事件。
當testkey
到期時,您現在將在__keyevent__
通道中收到一條消息,其中消息是過期密鑰的名稱。當然,在這一點上關鍵是消失了,所以我們不能再訪問價值!解決方案是使用特殊的過期密鑰。
當您創建您的testkey
時,還會創建一個特殊的過期「影子」鍵(不要過期實際的testkey
)。例如:
SET testkey 100
SET shadowkey:testkey "" EX 10
現在在[email protected]__:expired
通道,你會得到一個消息,告訴您該密鑰shadowkey:testkey
過期。取出消息的值(這是密鑰的名稱),分割冒號(或任何您決定使用的分隔符),然後手動獲取密鑰的值並將其刪除。
// set your key value
SET testkey 100
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey
注意,shadowkey的值沒有使用,所以你要使用它根據這個答案(Redis store key without a value)的最小可能值是一個空字符串""
。這是一個更多的工作來設置,但上述系統完全符合您的需求。開銷是一些額外的命令,用於實際檢索和刪除密鑰以及空密鑰的存儲成本。
到目前爲止,Redis 2.8仍然是候選版本。如果您需要對關鍵過期通知進行控制,則明確實施它可能會更好(不依賴於2.8)。請參閱http://stackoverflow.com/questions/11810020/how-to-handle-session-expire-basing-redis/11815594#11815594 –
那麼,2.8仍然是RC不是問題。問題在於Redis使用密鑰發佈事件,而不是條目的值。而且,因爲我們需要所有通知的這種行爲,所以也是2.6。我們需要一種方式告訴Redis在事件觸發時給我們整個對象,而不是密鑰。 –
我仍然會使用基於zset –