Redis實現消息隊列

能實現消息隊列的中間件有很多啊,kafka,RabbitMQ,RocketMQ等,不知道爲什麼還要利用Redis去實現消息隊列的功能呢?Redis實現消息隊列和上述專業的消息隊列中間件比,沒有什麼優勢。所以,還是別用Redis實現了。如果你還堅持使用Redis來實現,那麼好吧,接下來就介紹用Redis如何實現消息隊列吧!

PUSH/POP

Redis中五大數據結構之一—列表,其PUSH和POP命令遵循FIFO先進先出原則。當我們需要發佈消息的時候執行LPUSH(消息從左邊進入隊列),消息接收端執行RPOP獲得消息(消息從右側彈出)。對於列表,Redis提供了帶有阻塞的命令(命令前加B)。因此,生產者lpush消息,消費者brpop(從列表中彈出最右端元素,如無元素則一直阻塞到timeout)消息,並設定超時時間timeout,可以減少redis的壓力。

優點:消息可以持久化。
缺點:一條消息只能被一個消費者接受,消費者完全靠手速來獲得。是一種比較簡陋的消息隊列。

推薦指數:0。

PUB/SUB

Redis自帶有PUB/SUB機制,即發佈-訂閱模式。這種模式生產者(producer)和消費者(consumer)是1-M的關係,即一條消息會被多個消費者消費,當只有一個消費者時即可以看做一個1-1的消息隊列。

PUB/SUB機制模型如下,Channel可以看成一個用發佈消息的頻道,只要client訂閱了(subscribe)這個頻道,就能獲得次頻道的消息。

這裏寫圖片描述

最基本的使用

訂閱一個或多個頻道:
subscribe channel [channel2 channel3 。。。。 ]

client1訂閱channel

這裏寫圖片描述

client2訂閱channel1

這裏寫圖片描述

client3發佈消息到channel 和channel1

command:publish channel “content”

這裏寫圖片描述

可以看到,client1和client2都得到了消息。

關於PUB/SUB 的詳細命令如下:

  • PSUBSCRIBE
    訂閱一個或多個符合給定模式的頻道

  • PUBLISH
    將信息message 發送到指定的頻道channel

  • PUBSUB
    是一個查看訂閱與發佈系統狀態的內省命令

  • PUBSUB CHANNELS pattern
    列出當前的活躍頻道

  • PUBSUB NUMSUB channel-1 channel-N
    返回給定頻道的訂閱者數量

  • PUBSUB NUMPAT
    返回訂閱模式的數量

  • PUNSUBSCRIBE
    指示客戶端退訂所有給定模式

  • SUBSCRIBE
    訂閱給定的一個或多個頻道的信息

  • UNSUBSCRIBE
    指示客戶端退訂給定的頻道

最後總結一句:儘量不使用Redis實現消息隊列功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章