首页 > 解决方案 > 有没有一种方法可以在 N 秒后设置密钥?

问题描述

我正在使用Python 3.6.1 :: Anaconda 4.4.0 (64-bit)redis-cli 3.2.100通过Windows 10pip install redis==2.10.6

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

> SETEX s 10 "hi"
OK
> TTL s  # variable s still alive for 9 seconds
(integer) 9
> GET s
"hi"
> GET s  # ↑ within 10 seconds
"hi"     
> GET s  # ↓ 10 seconds later
(nil)

但是现在我需要一种可以在 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"

标签: python-3.xredis

解决方案


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

  1. 在 redis 中使用 设置一个虚拟计时器键SETEX,当它在 N 秒后过期时,我们设置我们的实际键。 我们如何知道密钥是否已过期?这可以通过订阅 redis expire events 来实现。

EXPIRE 会在 key 设置 expire 时生成 expire 事件,或者每次 key 上设置的正超时导致 key 被删除时都会生成 expired 事件(有关更多信息,请参阅 EXPIRE 文档)。

  1. 一种更简单的方法(您不必花很多时间进行同步工作)是使用像Celery这样的任务队列,并创建一个 Python 方法来设置您所需的密钥。Celery 允许装饰器和方法(如delayapply_async)将任务在队列中保留 N 秒,然后执行 post,这样您的密钥将在 N 秒后在 redis 中设置。

apply_async(args=None, kwargs=None, task_id=None, producer=None, link=None, link_error=None, shadow=None, **options)[来源] 通过发送消息异步应用任务。

参数:
args (Tuple) – 传递给任务的位置参数。

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

countdown (float) -- 任务应该执行的未来秒数。默认为立即执行。


推荐阅读