用于事件调度的队列/数据库?

时间:2013-11-26 04:49:41

标签: events nosql redis scheduling priority-queue

我可能会在某些时候建立自己的,但与此同时;是否存在语言通用事件调度程序 - 例如:{time, priority, action}作为输入 - 可在分片之间分发,并支持:

  • 在O(1)
  • 中排队(推)
  • 在O(log n)
  • 中出队(弹出)
  • 下一个预定(发现 - 分钟)在O(1)
  • 在O(log n)中任意删除,例如:使用指定为delete_queue的第二优先级队列

正在查看Redis,但无法为其找到合适的优先级队列接口。

1 个答案:

答案 0 :(得分:0)

我认为您不能使用Redis实现这样的队列,并且您为每个操作描述了确切的复杂性假设。

使用Redis可以使用zset。在内部,zset实现为标准哈希表和跳过列表(按分数和值排序)。因此,您可以使用分数来存储时间戳,并使用值来编码优先级和操作。 zset中的顺序首先是得分,然后是值本身(按字典顺序比较)。因此,我们的想法是选择一个值表示,其字典顺序对应于优先级所需的逻辑顺序。在这里,我假设时间优先于优先级(即优先级仅用于在具有相同时间戳的项目时对其进行排序)。

例如:

# timestamp=0, priority=3
zadd myqueue 0 03-action1

# timestamp=10, priority=2
zadd myqueue 10 02-action3

# timestamp=10, priority=1
zadd myqueue 10 01-action2

# The dequeuing order will be action1,action2,action3
# (because of priorities)

我相信各种操作的复杂性将是:

  • 入队O(log n)[使用zadd]
  • 出列O(log n)[使用zremrangebyrank]
  • 下一个预定项目O(1)[使用zrange获取第一个项目]
  • 任意删除O(log n)[使用zrem]

它们与您所寻找的不同,但它们并不是那么糟糕。