当我的Redis存储区中的易失性密钥过期时,我想收到通知。redis网站在http://redis.io/topics/notifications中提供了一些有关如何实现此目标的描述,但我想知道是否可以使用python redis api来完成。
设置后:notify-keyspace-events Ex在我的redis.conf文件中
notify-keyspace-events 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)
callback()仅在被调用时client.expire('a',5)被调用,但没有按预期在五秒钟后被调用
callback()
client.expire('a',5)
惊喜(当密钥的生存时间达到零时,没有看到过期事件)与Python无关,而是Redis正在使密钥过期。
Redis文档过期事件的计时
Redis通过两种方式使具有生存时间的密钥失效:
过期事件是在访问密钥时发现的,并且被上述系统之一发现已过期,因此,不能保证Redis服务器将能够在密钥生存时间生成过期事件。达到零值。
如果没有命令始终以该键为目标,并且有许多键与TTL相关联,则在键的生存时间降至零与生成过期事件的时间之间可能会有很大的延迟。
从本质上讲,过期事件 是在Redis服务器删除密钥时生成的, 而不是在理论上达到零的生存时间时生成的。
Redis运行时($ sudo service redis-server start)
$ sudo service redis-server start
我启动了一个控制台并订阅了:
$ 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__:expire 另一条消息 __keyevent@0__:expired 。
__keyevent@0__:expire
__keyevent@0__:expired
spy.py
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'}