【问题标题】:Delayed execution / scheduling with Redis?使用 Redis 延迟执行/调度?
【发布时间】:2011-05-07 12:57:38
【问题描述】:

基于 Redis 的延迟任务执行(即调度)有什么技巧吗?

也许有一些聪明的方法可以将 BLPOP 延迟给定的秒数?..

【问题讨论】:

    标签: scheduling redis delayed-execution


    【解决方案1】:

    虽然@efalcao 的回答非常好,但您的问题可能表明redis 并不完全适合您的应用程序需求。 如果您的应用程序具有消息框的性质,请考虑使用rabbitMQ,它具有延迟消息或akka,如果您觉得大胆

    【讨论】:

      【解决方案2】:

      如果你想使用 redis 进行调度,我建议使用 sorted set (z*) 命令:

      http://code.google.com/p/redis/wiki/SortedSets

      你可以做的是这样的:

      ZADD jobs <unix timestamp of when you want the job to run> <job identifier>
      

      例如:

      ZADD jobs 1291348355
      

      然后,您可以每隔一段时间(最多每秒)拉取应该运行(或现在应该已经运行)的计划作业:

      ZRANGEBYSCORE jobs -inf, <current unix timestamp>
      

      Boom,你的工作开始了。当然,请确保从排序集中删除已完成的作业。

      【讨论】:

      • 酷,但我想获得 BLPOP 语义。也就是说,我需要阻止我对 Redis 的查询,直到我有东西要运行。一秒的粒度不是很稳健。
      • 您是在排班还是在排队?我想这取决于你工作的精度。当我想到调度作业时,我会考虑“在 2 小时内”或“每小时”等。我认为在该用例中,亚秒级调度精度不是问题。排队/后台听起来更像您正在寻找的东西,即:“我想将工作推到后台,并让工作人员在排队后立即准备就绪。”在这种情况下,BLPOP 很有意义。在后台处理流数据(例如 Twitter 内容)时,我使用这样的方法。
      • 哦,老线程,但是 - Alexander - 你可以使用一种调度线程,它每 N 秒检查一次排序集,然后在主要工作人员正在 blpop'ing 时将工作从排序集移动到主工作列表。
      • BLPOP 方法易于扩展。您可以在 BLPOP 中阻止多个工作进程等待新项目。新项目将分发给听众。使用 ZRANGEBYSCORE 方法,拥有多个工人是很棘手的。
      【解决方案3】:

      您可以使用名称中包含时间组件的多个 LIST 的环。作为时间组件,您可以采用当前秒 (0-59)。

      您总是在当前秒内将任务添加到列表中。要获得作业,您只在保证内容早于给定秒数的那些列表上执行 BLPOP(低超时)。

      如果您在多个主机上工作,则必须注意时钟同步 (NTP)。

      【讨论】:

        猜你喜欢
        • 2019-04-05
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-11
        • 2011-03-04
        • 2011-01-25
        相关资源
        最近更新 更多