Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 密钥过期时,set_response_callback不调用回调方法_Python_Redis_Callback - Fatal编程技术网

Python 密钥过期时,set_response_callback不调用回调方法

Python 密钥过期时,set_response_callback不调用回调方法,python,redis,callback,Python,Redis,Callback,我正在尝试获取一个回调,当密钥过期时将触发该回调,使其按我所希望的方式工作,即: 当一个键过期时,我需要用过期的键作为参数调用回调方法 此回调必须是异步的 我的工作对象是: Ubuntu Redis 4.0.9 Python 3.6.7/redis.version=3.0.1 目前,我正在使用set\u response\u callback方法,您可以在提供的代码中看到这一点 当我使用Redis cli订阅Redis事件时,过期键会正确及时地显示: $ redis-cli --csv

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

  • 当一个键过期时,我需要用过期的键作为参数调用回调方法
  • 此回调必须是异步的
我的工作对象是:

  • Ubuntu
  • Redis 4.0.9
  • Python 3.6.7/redis.version=3.0.1
目前,我正在使用set\u response\u callback方法,您可以在提供的代码中看到这一点

当我使用Redis cli订阅Redis事件时,过期键会正确及时地显示:

$ 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"
但当我设置回调“过期”时,如下所示:

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\u TO\u expire)
且参数错误时,才会调用“\u key\u expired”回调

我希望参数是“key”,但我得到“1

问题1: 代码中有什么错误吗?或者我使用了错误的方法/参数来使这个用例工作

问题2
我知道,在JAVA中,可以订阅某个模式,例如
\uuuuu key*\uuuuu:expired
。我可以在Python中执行类似的操作吗?

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


set\u response\u callback()
用于覆盖redis py客户端命令的默认回调。实际的过期事件在调用回调后在Redis中异步发生。

但是发布/订阅连接将需要一个python线程处于活动等待状态,不是吗?实现取决于您,但是的,这是有意义的:)