gpt4 book ai didi

database - Redis 通知 : Get key and value on expiration

转载 作者:IT王子 更新时间:2023-10-29 05:54:47 26 4
gpt4 key购买 nike

我们有以下用例:每次某个键过期时,我们需要收到通知并根据它的值做一些事情。但是,当 Redis 触发 expired 事件时,当我们稍后尝试访问它时, key 已经从数据库中删除,这当然是意料之中的。

现在有没有办法在条目过期后再次访问该条目?我猜不是。

那么第二种选择:有没有办法告诉 Redis 在发送这些事件时发布整个值对象而不仅仅是键?我想它可以通过 Lua 添加,但如果可能的话,我对更简单的选择感兴趣。我们还需要其他事件的这种行为,我们基本上需要所有通知来发布值,而不是键(我们可以在收到事件后执行 GET,但我们想绕过第二次调用,主要是为了拥有一个原子过程,因为值可能在发布事件和执行 GET 以检索值之间发生变化)。

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

最佳答案

Eli 链接到的功能允许您在 key 过期时收听。但是,它不会为您提供 key 的值。此外,基于 filed github issue看起来您不会期望很快就会内置此功能。我使用的解决方案是创建一个特殊的“影子”到期 key ,该 key 链接到您拥有实际值的 key 。

假设您有一个名为 testkey 的 key 它的整数值为 100 .此外, key 将在 10 秒后过期,此时您想要获取 key 的值。 (也许您在 key 存在的 10 秒内增加了 key )。

首先,您需要设置监听键空间事件。特别是你想听 expired事件。您可以从您的配置中执行此操作或使用 config set redis 中的命令。 (有关更多信息,请参见此处:http://redis.io/topics/notifications)

CONFIG SET notify-keyspace-events Ex

现在您可以订阅特价 keyevent您将收到 key 过期通知的 channel 。

SUBSCRIBE __keyevent@0__:expired

要订阅的 channel 格式为__keyevent@<db>__:<eventName> .在我们的示例中,我们假设我们正在使用默认数据库 0 并且我们想要监听 expired事件。

testkey过期您现在将在 __keyevent__ 中收到一条消息 channel ,其中消息是过期 key 的名称。当然此时 key 已经消失,所以我们无法再访问该值!解决方案是使用特殊的过期 key 。

当您创建 testkey 时还创建一个特殊的过期“影子” key (不要使实际的 testkey 过期)。例如:

SET testkey 100
SET shadowkey:testkey "" EX 10

现在在__keyevent@0__:expired channel 你会收到一条消息,告诉你 key 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) 为空字符串 "" 的最小可能值.设置工作要多一些,但上面的系统完全可以满足您的需要。开销是实际检索和删除 key 的一些额外命令加上空 key 的存储成本。

关于database - Redis 通知 : Get key and value on expiration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18328058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com