当前位置: 首页 > 知识库问答 >
问题:

redis python中的密钥过期通知

端木兴国
2023-03-14

当我的redis存储中的易失性密钥过期时,我希望得到通知。redis网站提供了一些关于如何在http://redis.io/topics/notifications中实现这一点的描述,但我想知道是否可以使用python redis api来完成。

设置后:在我的redis.conf文件中通知-键空间-事件Ex

并将其作为测试运行:

import redis
import config

client = redis.StrictRedis.from_url(config.REDIS_URI) 
client.set_response_callback('EXPIRE',callback)
client.set('a', 1)
client.expire('a',5)

回调()只有在client.expire('a',5)被调用时才被调用,但没有像预期的那样晚五秒钟

共有1个答案

呼延宪
2023-03-14

令人惊讶的是(当一个键的生存时间为零时,没有看到过期事件)并不是与Python绑定的,而是与Redis使键过期的方式有关。

Redis文档关于过期事件的时间

Redis以两种方式过期与生存时间相关的密钥:

  • 当通过命令访问密钥并发现其已过期时
  • 通过后台系统,在后台逐步查找过期的密钥,以便能够收集从未访问过的密钥

过期事件是在访问密钥时生成的,并且被上述系统之一发现过期,因此不能保证Redis服务器能够在密钥生存时间达到零时生成过期事件。

如果没有命令持续以密钥为目标,并且有许多密钥与TTL相关,则在密钥生存时间降至零和生成过期事件之间可能存在显著延迟。

基本上,过期事件是在Redis服务器删除密钥时生成的,而不是在理论上生存时间达到零时生成的。

当Redis运行时($sudo服务Redis服务器启动)

我启动了一个控制台并订阅了:

$ redis-cli
PSUBSCRIBE "__key*__:*"

然后,在另一个控制台中:

$ redis-cli
> config set notify-keyspace-events AKE

什么应该订阅各种事件

然后我在第二个控制台中继续进行实验:

> set aaa aaa
> del aaa
> set aaa ex 5
> get aaa

所有活动都可以在订阅的控制台中看到。只有密钥过期有时会延迟几秒钟,有时来得正是时候。

另请注意,消息之间存在细微差异,一条消息<代码>__keyevent@0__:过期__keyevent@0__:过期。

import redis
import time

r = redis.StrictRedis()
pubsub = r.pubsub()
pubsub.psubscribe("*")
for msg in pubsub.listen():
    print time.time(), msg

此代码在默认redis中注册到所有现有通道并打印发布的任何内容。

运行它:

$ python spy.py

在另一个控制台中,尝试设置一个过期的密钥。你会看到所有的事件。

用于以下redis cli输入。

$ redis-cli
127.0.0.1:6379> set a aha
OK
127.0.0.1:6379> set b bebe ex 3
OK
127.0.0.1:6379> set b bebe ex 3
OK

我们得到间谍输出:

1401548400.27 {'pattern': None, 'type': 'psubscribe', 'channel': '*', 'data': 1L}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyspace@0__:a', 'data': 'set'}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyevent@0__:set', 'data': 'a'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyspace@0__:b', 'data': 'set'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyevent@0__:set', 'data': 'b'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyspace@0__:b', 'data': 'expire'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyevent@0__:expire', 'data': 'b'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyspace@0__:b', 'data': 'expired'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyevent@0__:expired', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyspace@0__:b', 'data': 'set'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyevent@0__:set', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyspace@0__:b', 'data': 'expire'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyevent@0__:expire', 'data': 'b'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyspace@0__:b', 'data': 'expired'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '__keyevent@0__:expired', 'data': 'b'}
 类似资料:
  • 问题内容: 当我的Redis存储区中的易失性密钥过期时,我想收到通知。redis网站在http://redis.io/topics/notifications中提供了一些有关如何实现此目标的描述,但我想知道是否可以使用python redis api来完成。 设置后:在我的redis.conf文件中 并进行测试: 仅在被调用时被调用,但没有按预期在五秒钟后被调用 问题答案: 惊喜(当密钥的生存时间

  • 问题内容: 当我的密钥在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的新手。

  • 在这个expire方法中,我们需要提供而不是。但是我需要过期而不是。 那么,请帮助我如何处理过期?

  • 我无法访问托管密钥库中的存储帐户密钥。下面是我的代码: 似乎$secret.secretValueText为空/null。如何正确检索存储帐户密钥?这就是出现的错误。

  • 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