標籤:nosql redis
訊息通知任務隊列使用任務隊列的好處
- 松耦合。生產者和消費者無需知道彼此的實現細節,只需要約定好任務的描述格式。這使得生產者和消費者可以由不同的團隊使用不同的程式設計語言編寫
- 易於擴充。消費者可以有多個,而且可以分布在不同的伺服器中, 藉此可以輕易地降低單台伺服器的負載
使用LPUSH和RPOP命令實現隊列, 這裡介紹一個新命令BRPOP和BLPOP BRPOP key [key ...] timeout(s) BRPOP命令和RPOP命令相似,唯一的區別是當列表中沒有元素時BRPOP命令會一直阻塞住串連,直到有新元素加入
優先順序隊列
利用BRPOP命令可以檢測多個key的功能。如果多個鍵都有元素,則按照從左至右順序取第一個鍵中的一個元素。因此,要實現優先順序隊列,把優先順序高的key放到前面就ok了。
發布/訂閱 模式
- "發布/訂閱"模式中包含兩種角色,分別是發行者和訂閱者。
- 訂閱者可以訂閱一個或若干個頻道(channel)
- 發行者可以向指定的頻道發送訊息,所有訂閱此頻道的訂閱者都會收到此訊息。
命令 |
描述 |
PUBLISH channel msg |
發布訊息. 接收到這條訊息的訂閱者數量. 發出去的訊息不會被持久化,也就是說當有客訂閱channel後只能收到後續發布到該頻道的訊息,之前發送的就收不到了 |
SUBSCRIBE channel [channel ...] |
訂閱頻道,可以同時訂閱多個頻道 |
UNSUBSCRIBE [channel ...] |
取消訂閱指定的頻道, 如果不指定頻道,則會取消訂閱所有頻道 |
PSUBSCRIBE pattern [pattern ...] |
訂閱一個或多個符合給定模式的頻道 |
PUNSUBSCRIBE [pattern [pattern ...]] |
退訂指定的規則, 如果沒有參數則會退訂所有規則 |
PUBSUB subcommand [argument [argument ...]] |
查看訂閱與發布系統狀態 |
注意
- 執行SUBSCRIBE命令後用戶端會進入訂閱狀態,處於此狀態下用戶端不能使用除SUBSCRIBE/UNSUBSCRIBE/PSUBSCRIBE/PUNSUBSCRIBE這4個屬於“發布/訂閱”模式的命令之外的命令,否則會報錯
- 使用PUNSUBSCRIBE命令只能退訂通過PSUBSCRIBE命令訂閱的規則,不會影響直接通過SUBSCRIBE命令訂閱的頻道;同樣UNSUBSCRIBE命令也不會影響通過PSUBSCRIBE命令訂閱的規則。另外容易出錯的一點是使用PUNSUBSCRIBE命令退訂某個規則時不會將其中的萬用字元展開,而是進行嚴格的字串匹配,所以PUNSUBSCRIBE無法退訂channel.規則,而是必須使用PUNSUBSCRIBE channel.*才能退訂
進入訂閱狀態後用戶端可能收到三種類型的回複。 每種類型的回複都包含3個值,
訊息類型(第一個值) |
第二個值 |
第三個值 |
subscribe:表示訂閱成功的反饋資訊 |
訂閱成功的頻道名稱 |
當前客訂閱的頻道數量 |
message:表示接收到的訊息 |
產生訊息的頻道名稱 |
訊息的內容 |
unsubscribe:表示成功取消訂閱某個頻道 |
對應的頻道名稱 |
當前客訂閱的頻道數量 |
第一個值為unsubscribe, 當第三個值為0時用戶端會退出訂閱狀態,之後就可以執行其他非“發布/訂閱”模式的命令了
樣本:
redis A>SUBSCRIBE channel.1Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "channel.1"3) (integer) 1
# PSUBSCRIBE 按規則訂閱redis C>PSUBSCRIBE channel.?*Reading messages... (press Ctrl-C to quit)1) "psubscribe"2) "channel.?*"3) (integer) 1redis B>PUBLISH channel.1 hi!(integer) 2#此時,C接收到回複1) "pmessage"2) "channel.?*" # 注意回複多了一個值,第二個值為訂閱時使用的萬用字元3) "channel.1"4) "hi!"
規則channel.?*可以匹配channel.1和channel.10,但不會匹配channel.。
如果發現錯誤,請輕拍,歡迎留言交流,謝謝
Redis訊息通知