訊息佇列,是在構建大型專案的時候 經常會用到的中間價系統,使用訊息佇列有很多好處,例如:
1. 實現各元件之間的松耦合。利用訊息系統可以使各個元件之間面向資料,而不是面向具體的介面。
2. 易於擴充套件。對於訊息系統而言,消費者和生產者都可以橫向擴充套件。
提到佇列,很自然的就會想到redis的列表型別,可以利用列表型別的lpush和rpop命令來完成,生產者呼叫lpush向佇列發布資料,消費者呼叫rpop命令從佇列中獲取資料。
#迴圈獲取
loop
$task = rpop queue
if$task
#有任務則執行
exec($task)
else
#等待一秒避免過於頻繁
wait
1 seconds
此處是用無限迴圈的方式獲取不斷檢查佇列中是否有任務,還可以利用redis的brpop命令來阻塞獲取佇列中的資料,這樣,當佇列中有任務時,消費者就會馬上獲取,避免了頻繁的迴圈。
loop
$task
= brpop queue
0#0表示不設定超時時間
exec($task)
試想一下這樣的場景,有兩類任務task1和task2,task1中的任務比task2中的任務更重要,系統應該優先處理task1中的任務。
以上需求,如果用redis類實現該怎麼做呢?
brpop命令的另一種用法是:接收多個列表中的資料brpop queue1 queue2 0
,當兩個佇列中都沒有資料時,brpop
會阻塞,當其中乙個佇列中有資料時,會獲取該佇列中的資料,當兩個佇列中都有資料時,會按照從左到右的順序來獲取資料。
利用第三個特性,我們很容易就可以實現乙個帶有優先順序的佇列:
loop
$task
= brpop
queue:confirmation.email
queue:notification.email
0exec($task)
除了訊息佇列外,redis還提供了一組命令publish/ subscribe
用來實現發布訂閱模式下的訊息傳遞。
發布-訂閱模式中有兩種角色,一種是發布者,一種是訂閱者,發布者發布訊息,訂閱者消費訊息,訂閱了同乙個頻道的訂閱者都會受到該頻道的訊息。
public channel message
subscribe channel
Redis訊息佇列
redis的訊息佇列使用簡單,沒有什麼配置,比activemq要輕量級太多,當然功能也比較簡單,如果只需要簡單的訂閱以及發布,可以考慮使用它。訂閱操作 命令為 subscribe channel channel 如 1 所示,即成功訂閱頻道 redis.blog 發布操作 命令為publish ch...
Redis訊息佇列
redis的訊息佇列使用簡單,沒有什麼配置,比activemq要輕量級太多,當然功能也比較簡單,如果只需要簡單的訂閱以及發布,可以考慮使用它。訂閱操作 命令為 subscribe channel channel 如 1 所示,即成功訂閱頻道 redis.blog 發布操作 命令為publish ch...
redis實現訊息佇列
用redis實現乙個訊息通知系統,總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。記憶體 比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所以如果只...