当前位置: 首页 > 面试题库 >

Redis通知:到期时获取密钥和值

束俊材
2023-03-14
问题内容

我们有以下用例:每当某个密钥过期时,我们都需要根据其值来得到通知并执行某些操作。但是,当redis触发该expired事件时,当我们稍后尝试访问它时,该密钥已经从数据库中删除了,这当然是可以预期的。

现在,有一种方法可以在过期后再次访问该条目?我猜不会。

第二种选择:有没有一种方法可以让redis在发送这些事件时发布整个值对象而不是仅仅发布键?我想可以通过Lua添加它,但是如果可能的话,我希望有一个更简单的选择。对于其他事件,我们也需要这种行为,基本上,我们需要所有通知来发布值,而不是键(我们可以GET在事件收到后立即执行一次,但是我们想绕开第二个调用,主要是拥有一个原子过程,因为值可能会在发布事件和执行GET检索值之间更改。

希望这是可以理解的。也许我们看不到明显的东西,所以先谢谢!


问题答案:

Eli链接到的功能使您可以在密钥过期时进行监听。但是,它不能为您提供密钥的值。此外,基于已归档的github问题,您似乎无法期望很快就可以构建此功能(https://github.com/antirez/redis/issues/1876)。我使用的解决方案是创建一个特殊的“影子”过期密钥,该密钥链接到您具有实际值的密钥。

因此,假设您有一个名为的密钥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数据存储区中过期时,我正在尝试使用Redis实施过期密钥通知。redis网站提供了一些有关http://redis.io/topics/notifications的描述,但是我无法找到任何示例,例如使用Jedis的redis java客户端如何做到这一点? 任何可能的带有插图的代码都将非常有用,因为它们是redis的新功能。 问题答案: 您只能使用 pub-sub

  • 当我的密钥在redis数据存储中过期时,我试图用redis实现过期密钥通知。redis网站提供了一些如何http://redis.io/topics/notifications,但我找不到任何像Jedis这样使用redis java客户端的例子? 任何可能的带有插图的代码都会非常有用,因为我是redis的新手。

  • 14:52:46.692[pool-1-thread-12]信息EndtoEnditTests-设置版本时间1548062566687 14:52:46.693[pool-1-thread-6]信息EndtoEnditTests-设置版本时间1548062566687 14:52:46.693[pool-1-thread-20]信息EndtoEndittest-设置版本时间154806256668

  • 问题内容: 当我的Redis存储区中的易失性密钥过期时,我想收到通知。redis网站在http://redis.io/topics/notifications中提供了一些有关如何实现此目标的描述,但我想知道是否可以使用python redis api来完成。 设置后:在我的redis.conf文件中 并进行测试: 仅在被调用时被调用,但没有按预期在五秒钟后被调用 问题答案: 惊喜(当密钥的生存时间

  • 当我的redis存储中的易失性密钥过期时,我希望得到通知。redis网站提供了一些关于如何在http://redis.io/topics/notifications中实现这一点的描述,但我想知道是否可以使用python redis api来完成。 设置后: 并将其作为测试运行: 只有在被调用时才被调用,但没有像预期的那样晚五秒钟

  • 问题内容: 我正在使用Bottle开发应用程序。在我的注册表中,我要通过邮件确认带有唯一密钥的电子邮件。我将此密钥存储在REDIS中,有效期为4天。如果用户未在4天内确认电子邮件,则密钥将过期。为此,我想从数据库(mongoDB)中永久删除用户条目。 当然,我不需要对我的Redis服务器进行连续轮询来检查密钥是否存在。 有什么办法可以从Redis获得回调吗? 或者还有其他有效的方法吗? 问题答案: