基于 Redis 的延迟任务执行(即调度)有什么技巧吗?
也许有一些聪明的方法可以将 BLPOP 延迟给定的秒数?..
如果您想使用 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>
繁荣,你有你的工作运行。当然,请确保从排序集中删除已完成的作业。
您可以使用名称中包含时间组件的多个 LIST 的环。作为时间组件,您可以采用当前秒 (0-59)。
您总是在当前秒内将任务添加到列表中。要获得作业,您只在保证内容早于给定秒数的那些列表上执行 BLPOP(低超时)。
如果您在多个主机上工作,则必须注意时钟是同步的 (NTP)。