Eli 链接到的功能允许您在密钥过期时进行监听。但是,它不会为您提供密钥的值。此外,根据提交的 github 问题,如果有的话,您似乎无法期望在任何时候都内置此功能。我使用的解决方案是创建一个特殊的“影子”到期密钥,该密钥链接到您拥有实际值的密钥。
因此,假设您有一个名为的键testkey
,它的整数值为100
. 此外,密钥将在 10 秒后过期,此时您想要获取密钥的值。(也许您在密钥存在的 10 秒内递增密钥)。
首先,您需要设置监听键空间事件。特别是你想监听expired
事件。您可以从配置中执行此操作,也可以config set
在 redis 中使用该命令。(有关更多信息,请参见此处:http ://redis.io/topics/notifications )
CONFIG SET notify-keyspace-events Ex
现在您可以订阅一个特殊keyevent
频道,您将在该频道收到密钥已过期的通知。
SUBSCRIBE __keyevent@0__:expired
要订阅的频道的格式是__keyevent@<db>__:<eventName>
. 在我们的示例中,我们假设我们正在使用默认数据库 0 并且我们想要监听expired
事件。
当testkey
过期时,您现在将在__keyevent__
通道中收到一条消息,其中消息是过期密钥的名称。当然,此时密钥已消失,因此我们无法再访问该值!解决方案是使用特殊的过期密钥。
当您创建您的testkey
同时创建一个特殊的过期“影子”键(不要使实际过期testkey
)。例如:
SET testkey 100
SET shadowkey:testkey "" EX 10
现在在__keyevent@0__: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 __keyevent@0__: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)的最小可能值是一个空字符串""
。设置需要做更多的工作,但上述系统完全可以满足您的需要。开销是一些额外的命令来实际检索和删除您的密钥以及空密钥的存储成本。