我正在尝试使用Redis实现一个调度程序,但是我想防止拉动,而是在使用ZREVRANGEBYSCORE
之类的BRPOPLPUSH
之类的分数匹配之前阻止“阻塞”。
为了进行测试,我将使用Unix时间戳记来创建一个排序集,如下所示:
zadd queue <timestamp> <payload>
要仅获取需要使用的任务,其时间戳小于/等于<NOW_timestamp>
的任务:
tasks = ZREVRANGEBYSCORE queue <NOW_timestamp> 0
对于任务中的每个任务,我将它们添加到to_do
队列中,例如
LPUSH to_do task
最后,我有一个工作人员使用BRPOPLPUSH
从to_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:37
和13:47
之间执行,但不能精确地在13:37
关于如何实现此目标的任何想法?