首頁 > 資料庫 > Redis > 主體

redis可以當訊息佇列使用嗎

(*-*)浩
發布: 2019-06-18 10:10:58
原創
3591 人瀏覽過

Redis不僅可作為快取伺服器,還可用作訊息佇列。它的列表類型天生支援用作訊息隊列。

redis可以當訊息佇列使用嗎

由於Redis的列表是使用雙向鍊錶實現的,保存了頭尾節點,所以在列表頭尾兩邊插取元素都是非常快的。 (建議學習:Redis影片教學

所以可以直接使用Redis的List實作訊息佇列,只需簡單的兩個指令lpush和rpop或rpush和lpop。

但會有訊息消費者有一個問題存在,就是需要不停的呼叫rpop方法來查看List中是否有待處理訊息。每呼叫一次都會發起一次連接,這會造成不必要的浪費。也許你會使用Thread.sleep()等方法讓消費者執行緒隔一段時間再消費,但這樣做有兩個問題:

1)、如果生產者速度大於消費者消費速度,訊息佇列長度會一直增大,時間久了會佔用大量記憶體空間。

2)、如果睡眠時間過長,這樣不能處理一些時效性的消息,睡眠時間過短,也會在連線上造成比較大的開銷。

所以可以使用brpop指令,這個指令只有在有元素時才返回,沒有則會阻塞直到逾時返回null,然後可以運行Customer,清空控制台,可以看到程式沒有任何輸出,阻塞在了brpop這兒。然後在開啟Redis的客戶端,輸入指令client list,可以查看目前有兩個連線。

Redis除了對訊息佇列提供支援外,還提供了一組命令用於支援發布/訂閱模式。

1)發布

PUBLISH指令可用於發布一則訊息,格式 PUBLISH channel message

##傳回值表示訂閱了該訊息的數量。

2)訂閱

SUBSCRIBE指令用於接收一條訊息,格式SUBSCRIBE channel

#可以看到使用SUBSCRIBE指令後進入了訂閱模式,但沒有接收到publish發送的訊息,這是因為只有在訊息發出去前訂閱才會接收到。在這個模式下其他指令,只能看到回應。

回覆有三種類型:

1、如果為subscribe,第二個值表示訂閱的頻道,第三個值表示是第幾個訂閱的頻道?(理解成序號?) 

2、如果為message(訊息),第二個值為產生該訊息的頻道,第三個值為訊息

3、如果為unsubscribe,第二個值表示取消訂閱的頻道,第三個值表示目前客戶端的訂閱數量。

可以使用指令UNSUBSCRIBE退訂,如果不加參數,則會取消所有由SUBSCRIBE指令訂閱的頻道。

Redis也支援基於通配符的訊息訂閱,使用指令PSUBSCRIBE (pattern subscribe)。


可以看到publish指令回傳的是2,而訂閱端這邊接收了兩次訊息。這是因為PSUBSCRIBE指令可以重複訂閱頻道。而使用PSUBSCRIBE指令訂閱的頻道也要使用指令PUNSUBSCRIBE指令退訂,指令無法退訂SUBSCRIBE訂閱的頻道,同理UNSUBSCRIBE也無法退訂PSUBSCRIBE指令訂閱的頻道。同時PUNSUBSCRIBE指令通配符不會展開。

總結:

使用Redis的List資料結構可以簡單迅速地做一個訊息佇列,同時Redis提供的BRPOP和BLPOP等指令解決了頻繁調用Jedis的rpop和lpop方法造成的資源浪費問題。除此之外,Redis提供發布/訂閱模式的指令,可以實現訊息傳遞、進程間通訊。

更多Redis相關技術文章,請造訪

Redis資料庫使用入門教學欄位學習!

以上是redis可以當訊息佇列使用嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板