Redis消息隊列

  消息隊列主要分爲兩種,分別是生產者消費者模式和發佈者訂閱者模式,這兩種模式 Redis 都支持。redis

生產消費者模式

  在生產消費者(Producer/Consumer)模式下, 上層應用接收到的外部請求後開始處理其當前步驟的操做,在執行完成後將已經完成的操做發送至指定的頻道(channel)當中,並由其下層的應用監聽該頻道並繼續下一步的操做, 若是其處理完成後沒有下一步的操做就直接返回數據給外部請求,若是還有下一步的操做就再將任務發佈到另一個頻道, 由另一個消費者繼續監聽和處理。centos

生產消費這模式介紹

  生產者消費者模式下, 多個消費者同時監聽一個隊列,可是一個消息只能被最早搶到消息的消費者消費, 即消息任務是一次性讀取和處理, 此模式在分佈式業務架構中很是經常使用, 比較經常使用的軟件還有RabbitMQ、 Kafka、 RocketMQ、 ActiveMQ 等bash

Redis消息隊列

隊列介紹

  隊列當中的 消息由不一樣的生產者寫入也會有不一樣的消費者取出進行消費處理,可是一個消息必定是隻能被取出一次也就是被消費一次。架構

Redis消息隊列

生產者發佈消息

127.0.0.1:6379> LPUSH channel1 msg1 # 從管道的左側寫入
(integer) 1
127.0.0.1:6379> LPUSH channel1 msg2
(integer) 2
127.0.0.1:6379> LPUSH channel1 msg3
(integer) 3
127.0.0.1:6379> LPUSH channel1 msg4
(integer) 4
127.0.0.1:6379> LPUSH channel1 msg5
(integer) 5

查看隊列全部消息

127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg5"
2) "msg4"
3) "msg3"
4) "msg2"
5) "msg1"

消費者消費消息

127.0.0.1:6379> RPOP channel1 # 從管道的右側消費
"msg1"
127.0.0.1:6379> RPOP channel1
"msg2"
127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg5"
2) "msg4"
3) "msg3"
127.0.0.1:6379> RPOP channel1
"msg3"
127.0.0.1:6379> RPOP channel1
"msg4"
127.0.0.1:6379> RPOP channel1
"msg5"
127.0.0.1:6379> RPOP channel1
(nil)

驗證隊列消息

127.0.0.1:6379> LRANGE channel1 0 -1
(empty list or set)  # 隊列中的消息已經被已所有消費完畢

發佈者訂閱模式

  在發佈者訂閱者模式下,發佈者將消息發佈到指定的 channel 裏面, 凡是監聽該 channel 的消費者都會收到一樣的一份消息,這種模式相似因而收音機模式,即凡是收聽某個頻道的聽衆都會收到主持人發佈的相同的消息內容。
  此模式經常使用語羣聊天、 羣通知、羣公告等場景。
  Subscriber:訂閱者
  Publisher: 發佈者
  Channel: 頻道 分佈式

Redis消息隊列

監聽者監聽頻道

[root@centos7-6 ~]#redis-cli 
127.0.0.1:6379> SUBSCRIBE channel1  # 訂閱者訂閱指定頻道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1

發佈者發佈消息

[root@centos7-6 ~]#redis-cli
127.0.0.1:6379> PUBLISH channel1 test1  # 發佈消息
(integer) 1
127.0.0.1:6379> PUBLISH channel1 test2
(integer) 1

訂閱者驗證消息

[root@centos7-6 ~]#redis-cli 
127.0.0.1:6379> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "test1"    # 發佈者發佈的test1消息
1) "message"
2) "channel1"
3) "test2"    # 發佈者發佈的test2消息

訂閱多個頻道

# 訂閱指定的多個頻道
127.0.0.1:6379> SUBSCRIBE channel1 channel2

訂閱全部頻道

127.0.0.1:6379> PSUBSCRIBE *

訂閱匹配的頻道

127.0.0.1:6379> PSUBSCRIBE chann* #匹配訂閱多個頻道
相關文章
相關標籤/搜索