密钥过期后,set_response_callback不会调用回调方法

时间:2019-01-24 11:08:16

标签: python redis callback

我正在尝试获取一个回调,该回调将在密钥过期时触发,以便按我希望的方式工作,即:

  • 当键过期时,我需要使用过期键作为参数来调用回调方法;
  • 此回调必须是异步的。

我正在使用:

  • Ubuntu
  • Redis 4.0.9
  • Python 3.6.7 / redis.version = 3.0.1

目前,我正在使用 set_response_callback 方法,如您在提供的代码中所见。

当我订阅Redis事件时,使用 redis-cli ,可以正确并及时显示到期密钥:

$ redis-cli --csv psubscribe '__key*__:expired'

Reading messages... (press Ctrl-C to quit)
"psubscribe","__key*__:expired",1

"pmessage","__key*__:expired","__keyevent@0__:expired","key"
"pmessage","__key*__:expired","__keyevent@0__:expired","key"

但是当我设置回调'EXPIRE'时,如下所示:

r = redis.StrictRedis(host='localhost', port=6379, charset="utf-8", db=0)

def __key_expired(arg):
    with open('test', 'a') as f:
       f.write('%s' % arg)

r.set_response_callback('EXPIRE', __key_expired)

r.set('key', 'value')
r.expire('key', SECONDS_TO_EXPIRE)

( ... )

仅当调用r.expire('key', SECONDS_TO_EXPIRE)且参数错误时才调用“ __key_expired”回调。

我希望参数为“ ”,但得到“ 1 ”。

问题#1 : 代码有问题吗?还是我使用错误的方法/参数来使此用例正常工作?

问题2 : 我知道在JAVA中可以订阅某个模式,例如__key*__:expired。我可以在Python中做类似的事情吗?

1 个答案:

答案 0 :(得分:0)

您需要使用发布/订阅连接并订阅键空间通知(在服务器上启用后),而不要使用set_response_callback()

set_response_callback()用于覆盖redis-py客户端命令的默认回调。实际的到期事件在调用回调之后在Redis中异步发生。