【问题标题】:Queue/database for event scheduling?用于事件调度的队列/数据库?
【发布时间】:2013-12-11 02:29:37
【问题描述】:

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

  • 在 O(1) 中排队(推送)
  • 在 O(log n) 中出列(弹出)
  • O(1) 中的下一个计划(查找分钟)
  • 在 O(log n) 中任意删除,例如:通过使用指定为 delete_queue 的第二个优先级队列

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

【问题讨论】:

    标签: events nosql redis scheduling priority-queue


    【解决方案1】:

    我不认为你可以用你为每个操作描述的精确复杂度假设来使用 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]

    它们与您正在寻找的不同,但它们并没有那么糟糕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多