redis-python中的密钥过期通知
我希望在我的redis商店中的易失性密钥过期时收到通知。redis网站提供了一些关于如何在中实现这一点的描述,但我想知道是否可以使用python redis api来实现 设置后: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
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通过两种方式使与生存时间相关联的密钥过期:
- 当通过命令访问密钥并发现密钥已过期时
- 通过后台系统,在后台以增量方式查找过期的密钥,以便能够收集从未访问过的密钥
$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'}