Redis實現任務佇列、優先順序佇列

niceforbear發表於2016-01-12

生產者與消費者的程式碼故事。

任務佇列

Method 1

讀取任務佇列中的內容

loop
  $task = RPOP queue
  if $task
    execute $task
  else
    wait 1s

每一秒都有呼叫命令來檢視是否有新任務,實際上這種方式的效率是很低的。

可否建立訊息通知功能,每有新的任務,通知消費者來執行任務。

藉助BRPOP就可以實現這樣的功能。

BRPOP: 當列表中沒有元素時,BRPOP命令會一直阻塞住連線,直到有新元素加入。

Method 2

修改的程式碼:

$task = BRPOP queue, 0
execute $task[1]

同理於BLPOP & RPUSH

優先順序佇列

由於BRPOP可以一次執行多個鍵,藉此特性可以製作優先順序佇列

loop
  $task = 
    BRPOP queue.confirmation.email,
          queue.notification.email,
          0
  execute $task[1]

兩個queue互不影響,那麼一個執行緒就可以監聽兩個佇列的內容,哪怕是一個佇列的內容很多,但是每次loop還是會執行一次另外一個佇列。

相關文章