封锁(B)ZREVRANGEBYSCORE,直到分数符合标准

时间:2018-11-06 14:05:13

标签: redis scheduler

我正在尝试使用Redis实现一个调度程序,但是我想防止拉动,而是在使用ZREVRANGEBYSCORE之类的BRPOPLPUSH之类的分数匹配之前阻止“阻塞”。

为了进行测试,我将使用Unix时间戳记来创建一个排序集,如下所示:

zadd queue <timestamp> <payload>

要仅获取需要使用的任务,其时间戳小于/等于<NOW_timestamp>的任务:

tasks = ZREVRANGEBYSCORE queue <NOW_timestamp> 0 

对于任务中的每个任务,我将它们添加到to_do队列中,例如

LPUSH to_do task

最后,我有一个工作人员使用BRPOPLPUSHto_do移出任务并将其添加到in_progress队列中:

BRPOPLPUSH to_do in_progress 0

这是可行的,但是我想知道是否有一种方法可以使用BRPOPLPUSH来进行类似于ZREVRANGEBYSCORE的操作,这样我就可以避免频繁拉或打电话:

for {
    # every X seconds
    ZREVRANGEBYSCORE queue <NOW_timestamp> 0
    ....
}

除了一次射击外,将与所需分数匹配的任务移到另一队列中,BRPOPLPUSH可能会消耗掉该任务。

这样做的目的是为了加快任务的分配速度,并且至少在几秒钟的时间内更精确,以保证任务的执行时间,例如,如果计划将任务调度为运行在13:37上,但是如果我每10秒进行一次缓冲,则任务可能在13:3713:47之间执行,但不能精确地在13:37

上执行

关于如何实现此目标的任何想法?

0 个答案:

没有答案