使用 Redis 延迟执行/调度?

发布于 2024-10-01 06:42:40 字数 73 浏览 3 评论 0原文

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

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

Any tricks to do delayed task execution (i.e. scheduling) based on Redis?

Perhaps some clever way to delay BLPOP for a given number of seconds?..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

櫻之舞 2024-10-08 06:42:40

如果您想使用 Redis 进行调度,我建议使用排序集(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>

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

If you want to do scheduling with redis, i would suggest using sorted set (the z*) commands:

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

what you can do is something like this:

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

e.g:

ZADD jobs 1291348355

Then, every so often (up to every second) you can pull scheduled jobs that should run (or should have run by now):

ZRANGEBYSCORE jobs -inf, <current unix timestamp>

Boom, you got your jobs to run. Of course, make sure to delete done jobs from the sorted set.

桃扇骨 2024-10-08 06:42:40

您可以使用由多个列表组成的环,这些列表的名称中包含时间部分。作为时间部分,您可以采用当前秒数 (0-59)。

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

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

You can work with a ring of multiple LISTs that have a time component in their name. As time component you can take the current second (0-59).

You always add tasks to the list for the current second. To get the jobs you do a BLPOP (with low timeout) only on those lists where it is guaranteed, that the content is older than the given number of seconds.

If you work from multiple hosts you have to take care, that the clocks are in sync (NTP).

泪是无色的血 2024-10-08 06:42:40

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

While the @efalcao's answer is a very good one, your question might indicate that redis does not perfectly suit your application needs.
if your application has the nature of a message box, please consider using rabbitMQ, which features delayed messages or akka if you feel bold

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文