ELI链接的功能允许您监听密钥何时过期.但是,它不会给您提供密钥的值.此外,基于filed github issue,看起来您不能期望在短期内构建此功能(如果有的话).我使用的解决方案是创建一个特殊的"影子"到期密钥,该密钥链接到您具有实际值的密钥.
假设您有一个名为testkey
的密钥,它的整数值为100
.此外,密钥将在10秒后过期,此时您想要获取密钥的值.(可能您在密钥存在的10秒内递增了密钥).
首先,需要设置按键空间事件的监听.特别是你想要听expired
个事件.您可以通过配置或使用redis中的config set
命令来执行此操作.(更多信息请参见此处: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),它是一个空字符串""
.这是一个多一点的工作,以设置,但上述系统正是你所需要的.开销是实际检索和删除密钥所需的几个额外命令,加上一个空密钥的存储成本.