4

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

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

4

3 回答 3

17

如果您想使用 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>

繁荣,你有你的工作运行。当然,请确保从排序集中删除已完成的作业。

于 2010-12-03T03:58:33.820 回答
1

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

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

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

于 2010-11-10T10:33:52.497 回答
1

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

于 2014-12-30T05:08:12.350 回答