消息隊列主要分爲兩種,分別是生產者消費者模式和發佈者訂閱者模式,這兩種模式 Redis 都支持。redis
在生產消費者(Producer/Consumer)模式下, 上層應用接收到的外部請求後開始處理其當前步驟的操做,在執行完成後將已經完成的操做發送至指定的頻道(channel)當中,並由其下層的應用監聽該頻道並繼續下一步的操做, 若是其處理完成後沒有下一步的操做就直接返回數據給外部請求,若是還有下一步的操做就再將任務發佈到另一個頻道, 由另一個消費者繼續監聽和處理。centos
生產者消費者模式下, 多個消費者同時監聽一個隊列,可是一個消息只能被最早搶到消息的消費者消費, 即消息任務是一次性讀取和處理, 此模式在分佈式業務架構中很是經常使用, 比較經常使用的軟件還有RabbitMQ、 Kafka、 RocketMQ、 ActiveMQ 等bash
隊列當中的 消息由不一樣的生產者寫入也會有不一樣的消費者取出進行消費處理,可是一個消息必定是隻能被取出一次也就是被消費一次。架構
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: 頻道 分佈式
[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* #匹配訂閱多個頻道