能實現消息隊列的中間件有很多啊,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 發送到指定的頻道channelPUBSUB
是一個查看訂閱與發佈系統狀態的內省命令PUBSUB CHANNELS pattern
列出當前的活躍頻道PUBSUB NUMSUB channel-1 channel-N
返回給定頻道的訂閱者數量PUBSUB NUMPAT
返回訂閱模式的數量PUNSUBSCRIBE
指示客戶端退訂所有給定模式SUBSCRIBE
訂閱給定的一個或多個頻道的信息UNSUBSCRIBE
指示客戶端退訂給定的頻道
最後總結一句:儘量不使用Redis實現消息隊列功能。