StackExchange.Redis學習筆記(五) 發布和訂閱
原文:StackExchange.Redis學習筆記(五) 發布和訂閱
Redis命令中的Pub/Sub
Redis在 2.0之後的版本中 實現了 事件推送的 發布訂閱命令
以下是Redis關於發布和訂閱提供的相關命令
SUBSCRIBE channel [channel ...]
訂閱給定的一個或多個頻道的信息。
PSUBSCRIBE pattern [pattern ...]
訂閱一個或多個符合給定模式的頻道。
PUBLISH channel message
將信息 message 發送到指定的頻道 channel 。
PUBSUB <subcommand> [argument [argument ...]]
查看所有活躍的頻道
PUNSUBSCRIBE [pattern [pattern ...]]
客戶端退訂所有訂閱的給定模式的頻道
UNSUBSCRIBE [channel [channel ...]]
指示客戶端退訂給定的頻道。
這裏的頻道可以分為兩類,一種是指定名稱的頻道,還有一種是模糊匹配的頻道(模式),兩種類型的頻道 訂閱和退訂所需要的命令是不同的
下面分別演示下這些命令的基本用法
上圖中左邊客戶端訂閱了msg頻道的消息 。 另一個客戶端對msg頻道發布消息,訂閱的客戶端成功接收到消息。
我們用pubsub命令來查詢所有的活躍頻道。當前有一個活躍頻道msg
這裏左邊的客戶端訂閱了符合給定模式news.*的模式頻道,另一個客戶端向news.it 來發送消息,成功接收。
調用pusub查看活躍頻道時為空,因為模式頻道的訂閱不算在活躍頻道內
在dos命令下訂閱後界面就卡住等待消息了,所以沒辦法來演示取消訂閱的命令。就不貼圖了
StackExchange.Redis中的發布和訂閱
使用StackExchange.Redis發布和訂閱首先需要通過connection獲取一個Subscriber,該類實現了ISubscriber 接口,接口中定義了相應的Subscribe,Publish等相關函數。
用法比較簡單,直接上代碼了
publicclass RedisSubPub { public void SubScribe(string cnl) { Console.WriteLine("主線程:" + Thread.CurrentThread.ManagedThreadId); var sub = StackExchangeRedisHelper.Instance.GetSubscriber(); sub.Subscribe(cnl, SubHandel); Console.WriteLine("訂閱了一個頻道:"+ 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(); }
我用程序中的代碼作為訂閱者,訂閱了四個頻道,然後在Dos命令行窗口中向響應的頻道來發送消息
程序運行之後StackExchange.Redis默認訂閱了一個__Booksleeve_MasterChanged 頻道,這個訂閱主要是在Redis集群的主從配置發生改變時會觸發,我們忽略掉它
在客戶端我訂閱了三個頻道,以及一個others*模式頻道。通過pubsub命令查詢到了3個頻道
訂閱者調用Unsubscribe來取消訂閱特定的頻道,通過UnsubscribeAll取消訂閱所有的頻道
Redis是沒有提供取消訂閱所有頻道的命令的,StackExchange.Redis通過把每一個訂閱的頻道都加到一個字典中,然後取消的時候會從字典中來查詢要取消的頻道名稱。
StackExchange.Redis源代碼片段如下
這段代碼也可以看出來保持訂閱頻道正確工作的前提是保持一個靜態的連接實例!
StackExchange.Redis學習筆記(五) 發布和訂閱