Redis 訊息佇列

2021-07-24 12:22:49 字數 1284 閱讀 3635

訊息佇列,是在構建大型專案的時候 經常會用到的中間價系統,使用訊息佇列有很多好處,例如:

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擴充套件來實現的。記憶體 比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所以如果只...