1. 程式人生 > >使用Redis實現優先順序佇列

使用Redis實現優先順序佇列

優先順序佇列是一種如先進先出佇列和堆疊資料結構的抽象資料型別。所不同的是每一個元素關聯一個“優先順序”。優先順序高的元素比優先順序低的元素優先得到處理。本文講解如何基於Redis的SORTED SET資料型別實現優先順序佇列。 SORTED SET中元素關聯一個SCORE,可以按SCORE有序查詢元素。 優先順序佇列基本操作實現如下:
  • is_empty: 檢視佇列是否為空。使用EXISTS命令可以實現。
EXISTS priority_queue
  • insert_with_priority: 新增一個關聯“優先順序”的元素到佇列中。直接使用ZADD命令可以實現。ZADD命令還有一系列選項可以支援更加複雜的操作。
ZADD priority_queue priority member
  • pull_highest_priority_element: 從佇列中刪除具有最高優先順序的元素並返回。Redis中沒有直接的命令支援該操作。本文使用Redis指令碼實現該操作。 Redis指令碼支援事務原子性和隔離性, 所以下面指令碼不會產生競爭條件。具體事務特性請參考
    https://redis.io/topics/transactions
local items = redis.call('zrangebyscore', KEYS[1], '-inf', '+inf', 'LIMIT', 0, 1)
if next(items) ~= nil then
   redis.call('zrem', KEYS[1], unpack(items))
end
return items
通過改寫上面的指令碼來實現也可以實現一次Pop多個元素。