2013-11-26 69 views
3

我可能會在某個時候建立我自己的,但在此期間;是有一個語言通用事件調度了結例如:{time, priority, action}作爲輸入,也就是說分配跨越碎片,並支持:在○○(1) 事件調度的隊列/數據庫?

  • 出隊(POP)

    • 入隊(推)( log n)的
    • 下一個計劃(找到分鐘)在O(1)
    • 任意刪除O(log n)的,例如:通過使用被指定delete_queue

    第二優先級隊列一直在尋找的Redis ,但找不到一個prope r優先隊列接口。

  • 回答

    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獲取第一個項目]
    • 任意del ete O(log n)[使用zrem]

    他們是不同的,你在找什麼,但他們並沒有那麼糟糕。