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 3.x 有没有一种方法可以在N秒后设置一个键?_Python 3.x_Redis - Fatal编程技术网

Python 3.x 有没有一种方法可以在N秒后设置一个键?

Python 3.x 有没有一种方法可以在N秒后设置一个键?,python-3.x,redis,Python 3.x,Redis,我在windows10上使用python3.6.1::anaconda4.4.0(64位)和rediscli3.2.100通过pip安装redis==2.10.6 我知道有一种方法可以设置密钥在N秒后过期,方法是使用 但现在我需要一种在N秒后设置密钥的方法,例如SETAF,还有一种在N秒后生成密钥的方法,例如AFTTL > SETAF s 10 "hi" # set s="hi" after 10 seconds OK > GET s (nil) > AFTTL s (int

我在
windows10上使用
python3.6.1::anaconda4.4.0(64位)
rediscli3.2.100
通过
pip安装redis==2.10.6

我知道有一种方法可以设置密钥在N秒后过期,方法是使用

但现在我需要一种在N秒后设置密钥的方法,例如
SETAF
,还有一种在N秒后生成密钥的方法,例如
AFTTL

> SETAF s 10 "hi"  # set s="hi" after 10 seconds
OK
> GET s
(nil)
> AFTTL s
(integer) 5
> GET s            # ↑ within 10 seconds
(nil)
> GET s            # ↓ 10 seconds later
"hi"

没有一种内在的方式可以做到这一点。我可以建议两种方法:

  • 使用
    SETEX
    在redis中设置一个虚拟计时器键,当它在N秒后过期时,我们设置实际的键。 我们如何知道密钥是否过期? 这是可以做到的。
  • EXPIRE在将EXPIRE设置为密钥时生成一个EXPIRE事件,或者每次在密钥上设置的正超时导致密钥被删除时生成一个EXPIRE事件(有关详细信息,请参阅EXPIRE文档)

  • 一种更简单的方法(您不需要做很多时间的同步工作)是使用任务队列,如,并创建一个Python方法来设置所需的键。 芹菜允许使用装饰器和类似或的方法,将任务保持在队列中N秒,并执行post,以便在N秒后在redis中设置密钥
  • 应用异步(args=None,kwargs=None,task\u id=None,producer=None, link=None,link\u error=None,shadow=None,**选项)[source]应用 通过发送消息异步执行任务

    参数:
    args(Tuple)–传递给 任务

    kwargs(Dict)–传递给任务的关键字参数

    倒计时(浮点)–任务执行到未来的秒数 应该执行。默认为立即执行


    没有一种内在的方式可以做到这一点。我可以建议两种方法:

  • 使用
    SETEX
    在redis中设置一个虚拟计时器键,当它在N秒后过期时,我们设置实际的键。 我们如何知道密钥是否过期? 这是可以做到的。
  • EXPIRE在将EXPIRE设置为密钥时生成一个EXPIRE事件,或者每次在密钥上设置的正超时导致密钥被删除时生成一个EXPIRE事件(有关详细信息,请参阅EXPIRE文档)

  • 一种更简单的方法(您不需要做很多时间的同步工作)是使用任务队列,如,并创建一个Python方法来设置所需的键。 芹菜允许使用装饰器和类似或的方法,将任务保持在队列中N秒,并执行post,以便在N秒后在redis中设置密钥
  • 应用异步(args=None,kwargs=None,task\u id=None,producer=None, link=None,link\u error=None,shadow=None,**选项)[source]应用 通过发送消息异步执行任务

    参数:
    args(Tuple)–传递给 任务

    kwargs(Dict)–传递给任务的关键字参数

    倒计时(浮点)–任务执行到未来的秒数 应该执行。默认为立即执行


    最后,我使用以下方法:

    首先定义在redis中删除密钥的方法

    r是一个
    redis.StrictRedis
    实例

    def remove_alarm(code, alarm_last): # alarm_last means how many seconds the key will keep alive
        time.sleep(alarm_last)
        r.srem('alarms', code)
    
    在我的主程序中,我设置了redis names alarms和values code的一个键,并触发一个线程调用remove\u alarm

    r.sadd('alarms', code)  # for code, it a paramater to my function
    threading.Thread(target=remove_alarm, args=(code, alarm_last)).start()
    

    虽然键“alarms”比“alarms\u last”更能保持活动状态(启动线程需要一些时间),但它对我很有用。

    最后,我使用以下方法:

    首先定义在redis中删除密钥的方法

    r是一个
    redis.StrictRedis
    实例

    def remove_alarm(code, alarm_last): # alarm_last means how many seconds the key will keep alive
        time.sleep(alarm_last)
        r.srem('alarms', code)
    
    在我的主程序中,我设置了redis names alarms和values code的一个键,并触发一个线程调用remove\u alarm

    r.sadd('alarms', code)  # for code, it a paramater to my function
    threading.Thread(target=remove_alarm, args=(code, alarm_last)).start()
    

    虽然“alarms”(报警)键比“alarms”(上一次)键更能保持活动状态(启动线程需要一些时间),但它对我很有用。

    没有内置的方法,你需要自己实现它。没有内置的方法,你需要自己实现它。