redis-python中的密钥过期通知

redis-python中的密钥过期通知,python,python-2.7,redis,Python,Python 2.7,Redis,我希望在我的redis商店中的易失性密钥过期时收到通知。redis网站提供了一些关于如何在中实现这一点的描述,但我想知道是否可以使用python redis api来实现 设置后:notifykeyspace events Ex在我的redis.conf文件中 并将其作为测试运行: import redis import config client = redis.StrictRedis.from_url(config.REDIS_URI) client.set_response_callb

我希望在我的redis商店中的易失性密钥过期时收到通知。redis网站提供了一些关于如何在中实现这一点的描述,但我想知道是否可以使用python redis api来实现

设置后:
notifykeyspace events Ex
在我的redis.conf文件中

并将其作为测试运行:

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)
callback()
仅在调用
客户端时调用。expire('a',5)
被调用,但不会像预期的那样晚五秒钟

令人惊讶的是(当一个键的生存时间达到零时,没有看到过期事件)并没有绑定到Python,而是绑定到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__:过期

示例侦听器
spy.py
此代码注册到默认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 cli获得预期的结果,但我不清楚这些命令如何转换为python API。Thanks@samfr示例显示如何订阅和监视添加的所有事件。
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'}