【问题标题】: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]
它们与您正在寻找的不同,但它们并没有那么糟糕。