2010-11-09 80 views

回答

1

你可以用那些在他们的名字时组件多个列表的环工作。作为时间分量,您可以选择当前秒(0-59)。

您总是将任务添加到当前列表中。要获得这些工作,你只能在那些有保证的列表上做一个BLPOP(低超时),这个列表的内容比给定的秒数早。

如果你从多个主机工作,你必须注意时钟是同步的(NTP)。

15

如果你想要做的Redis调度,我会建议使用的有序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 

然后,每隔一段时间(直到每个secon d)你可以拉预定的工作,应该运行(或应该已经运行了):

ZRANGEBYSCORE jobs -inf, <current unix timestamp> 

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

+0

很酷,但我想要获得BLPOP语义。也就是说,我需要对Redis进行查询,直到我有一些东西可以运行。一秒的粒度不是很健壮。 – 2010-12-03 04:29:34

+1

你是更安排还是排队?我想这取决于你工作的精度。当我想到按照“在2小时内”或“在每个小时内”等等的方式来安排工作时,我没有看到在该用例中亚秒级调度精度成为问题。 排队/背景听起来更像你正在寻找的东西,那就是:“我想把工作推到背景并让工作人员在排队后立即就绪。”在这种情况下,BLPOP具有很大的意义。我使用类似于后台处理流数据的方法(例如twitter内容)。 – efalcao 2010-12-03 05:38:59

+2

哦,老线程,但 - 亚历山大 - 你可以使用一种调度程序线程,它每隔N秒检查一次已排序的集合,并将主要作业工作者正在blpop的作业从已排序的集合移动到主作业列表中。 – 2012-08-20 12:13:41

1

虽然@ efalcao的答案是非常好的答案,但您的问题可能表明,redis完全符合您的应用程序需求。 如果您的应用程序具有消息框的性质,请考虑使用rabbitMQ其中包含延迟消息或akka如果您感觉大胆