StackExchange.Redis学习笔记(五) 发布和订阅
原文:StackExchange.Redis學(xué)習(xí)筆記(五) 發(fā)布和訂閱
Redis命令中的Pub/Sub
Redis在 2.0之后的版本中 實(shí)現(xiàn)了 事件推送的 ?發(fā)布訂閱命令
以下是Redis關(guān)于發(fā)布和訂閱提供的相關(guān)命令
SUBSCRIBE channel [channel ...]
訂閱給定的一個(gè)或多個(gè)頻道的信息。
PSUBSCRIBE pattern [pattern ...]
訂閱一個(gè)或多個(gè)符合給定模式的頻道。
PUBLISH channel message
將信息?message?發(fā)送到指定的頻道?channel?。
PUBSUB <subcommand> [argument [argument ...]]
查看所有活躍的頻道
PUNSUBSCRIBE [pattern [pattern ...]]
客戶端退訂所有訂閱的給定模式的頻道
UNSUBSCRIBE [channel [channel ...]]
指示客戶端退訂給定的頻道。
?
這里的頻道可以分為兩類,一種是指定名稱的頻道,還有一種是模糊匹配的頻道(模式),兩種類型的頻道 訂閱和退訂所需要的命令是不同的
下面分別演示下這些命令的基本用法
上圖中左邊客戶端訂閱了msg頻道的消息 。 另一個(gè)客戶端對(duì)msg頻道發(fā)布消息,訂閱的客戶端成功接收到消息。
我們用pubsub命令來(lái)查詢所有的活躍頻道。當(dāng)前有一個(gè)活躍頻道m(xù)sg
這里左邊的客戶端訂閱了符合給定模式news.*的模式頻道,另一個(gè)客戶端向news.it 來(lái)發(fā)送消息,成功接收。
調(diào)用pusub查看活躍頻道時(shí)為空,因?yàn)槟J筋l道的訂閱不算在活躍頻道內(nèi)
在dos命令下訂閱后界面就卡住等待消息了,所以沒(méi)辦法來(lái)演示取消訂閱的命令。就不貼圖了
?
StackExchange.Redis中的發(fā)布和訂閱
使用StackExchange.Redis發(fā)布和訂閱首先需要通過(guò)connection獲取一個(gè)Subscriber,該類實(shí)現(xiàn)了ISubscriber 接口,接口中定義了相應(yīng)的Subscribe,Publish等相關(guān)函數(shù)。
用法比較簡(jiǎn)單,直接上代碼了
public class RedisSubPub{public void SubScribe(string cnl){Console.WriteLine("主線程:" + Thread.CurrentThread.ManagedThreadId);var sub = StackExchangeRedisHelper.Instance.GetSubscriber();sub.Subscribe(cnl, SubHandel);Console.WriteLine("訂閱了一個(gè)頻道:"+ cnl);}public void SubHandel(RedisChannel cnl, RedisValue val){Console.WriteLine();Console.WriteLine("頻道:" + cnl + "\t收到消息:" + val); ;Console.WriteLine("線程:" + Thread.CurrentThread.ManagedThreadId + ",是否線程池:" + Thread.CurrentThread.IsThreadPoolThread);if (val == "close")StackExchangeRedisHelper.Instance.GetSubscriber().Unsubscribe(cnl);if (val == "closeall")StackExchangeRedisHelper.Instance.GetSubscriber().UnsubscribeAll();}}?
static void Main(string[] args){RedisSubPub r = new RedisSubPub();r.SubScribe("it");r.SubScribe("news");r.SubScribe("sport");r.SubScribe("others*");Console.Read();}?
我用程序中的代碼作為訂閱者,訂閱了四個(gè)頻道,然后在Dos命令行窗口中向響應(yīng)的頻道來(lái)發(fā)送消息
程序運(yùn)行之后StackExchange.Redis默認(rèn)訂閱了一個(gè)__Booksleeve_MasterChanged 頻道,這個(gè)訂閱主要是在Redis集群的主從配置發(fā)生改變時(shí)會(huì)觸發(fā),我們忽略掉它
在客戶端我訂閱了三個(gè)頻道,以及一個(gè)others*模式頻道。通過(guò)pubsub命令查詢到了3個(gè)頻道
訂閱者調(diào)用Unsubscribe來(lái)取消訂閱特定的頻道,通過(guò)UnsubscribeAll取消訂閱所有的頻道
Redis是沒(méi)有提供取消訂閱所有頻道的命令的,StackExchange.Redis通過(guò)把每一個(gè)訂閱的頻道都加到一個(gè)字典中,然后取消的時(shí)候會(huì)從字典中來(lái)查詢要取消的頻道名稱。
StackExchange.Redis源代碼片段如下
這段代碼也可以看出來(lái)保持訂閱頻道正確工作的前提是保持一個(gè)靜態(tài)的連接實(shí)例!
?
posted on 2019-01-30 00:19 NET未來(lái)之路 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/10336478.html
總結(jié)
以上是生活随笔為你收集整理的StackExchange.Redis学习笔记(五) 发布和订阅的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: Microsoft Artificial
- 下一篇: redis-cluster集群搭建
