Я не думаю, что вы можете реализовать такую очередь с 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)
Я считаю, что сложность различных операций будет:
- Enqueue O (журнал N) [используя Zadd]
- DEQUEUE O (журнал N) [с помощью zremrangebyrank]
- следующий запланированный объект O (1) [используя zrange для извлечения первого элемента]
- произвольный del ete O (log n) [using zrem]
Они отличаются тем, что вы ищете, но они не так уж плохи.