我不認爲你可以用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獲取第一個項目]
- 任意del ete O(log n)[使用zrem]
他們是不同的,你在找什麼,但他們並沒有那麼糟糕。