本文版權歸博客園和作者本人吳雙共同所有,轉載請注明本Redis系列分享地址。http://www.cnblogs.com/tdws/tag/NoSql/
Redis發布訂閱—Pub/Sub模式或者說是觀察者模式。我想大家即使沒有使用過,也已經耳熟能詳了。
先簡單舉例說明下應用場景,在場景中我們可以分析到其優勢在哪。
比如你的線上應用應用,你想設置一個日志報警系統,當應用出現異常的時候,立馬發送通知給你,可能是短信的形式,也可能是郵件的形式。當然如果只將報警通知給你一個人,實現起來很簡單,在報警系統中將你的手機號和短信寫死在程序中。但是如果你的項目龐大,每個模塊有各自的負責人,並且負責人也經常會變更,那么咱們就不能總修改代碼了吧?
或者說你的個人博客可以讓讀者訂閱,讀者這么多,咱們根本控制不過來呀。
現在發布訂閱模式,就可以解決你的問題。在某一點發生改變的時候,其他客戶端立即得到通知。也可以說訂閱服務器得到應用發布消息,由服務器立即通知給你手中的客戶端。這樣的好處就是一種松耦合的模式,你不再需要修改發布端和訂閱端的任何代碼,你只要提供好發布和訂閱的操作接口,今后調用就可以了。
首先看一下Redis在控制台中的發布訂閱操作。
我開啟兩個redis命令客戶端對相同的一個redis服務進行操作。
首先我們在第一個客戶端我們對message01進行訂閱,channel名稱是我們自定義的,訂閱哪個就是哪個。

其次,我們在第二個客戶端對message01這個channel進行發布消息。返回值表示有幾個客戶端訂閱。

發布消息后,訂閱的客戶端立即受收到消息。

畢竟我們不可能只將其用在Redis命令控制台哈,最后來看一下在.NET中的使用。我們依然借助StackExchange.
基礎配置,本系列第一篇分享已經包含。還記得靜態構造函數中,下面這段代碼嗎?
1 _redis.PreserveAsyncOrder = RedisClientConfigurations.PreserveAsyncOrder;//並行
配置中,定義了使用並行的方式來執行命令,大大提高了效率(在你無所謂消息傳遞的順序時,可以這樣使用)。
在接口中定義如下方法:
1 #region Redis發布訂閱 2 /// <summary> 3 /// Redis發布訂閱 訂閱 4 /// </summary> 5 /// <param name="subChannel"></param> 6 void RedisSub(string subChannel); 7 /// <summary> 8 /// Redis發布訂閱 發布 9 /// </summary> 10 /// <typeparam name="T"></typeparam> 11 /// <param name="channel"></param> 12 /// <param name="msg"></param> 13 /// <returns></returns> 14 long RedisPub<T>(string channel, T msg); 15 /// <summary> 16 /// Redis發布訂閱 取消訂閱 17 /// </summary> 18 /// <param name="channel"></param> 19 void Unsubscribe(string channel); 20 /// <summary> 21 /// Redis發布訂閱 取消全部訂閱 22 /// </summary> 23 void UnsubscribeAll(); 24 25 #endregion
實現如下:
1 #region Redis發布訂閱 2 /// <summary> 3 /// Redis發布訂閱 訂閱 4 /// </summary> 5 /// <param name="subChannel"></param> 6 public void RedisSub(string subChannel) 7 { 8 sub.Subscribe(subChannel, (channel, message) => 9 { 10 Console.WriteLine((string)message); 11 }); 12 } 13 /// <summary> 14 /// Redis發布訂閱 發布 15 /// </summary> 16 /// <typeparam name="T"></typeparam> 17 /// <param name="channel"></param> 18 /// <param name="msg"></param> 19 /// <returns></returns> 20 public long RedisPub<T>(string channel, T msg) 21 { 22 23 return sub.Publish(channel, SerializeContent(msg)); 24 } 25 /// <summary> 26 /// Redis發布訂閱 取消訂閱 27 /// </summary> 28 /// <param name="channel"></param> 29 public void Unsubscribe(string channel) 30 { 31 sub.Unsubscribe(channel); 32 } 33 /// <summary> 34 /// Redis發布訂閱 取消全部訂閱 35 /// </summary> 36 public void UnsubscribeAll() 37 { 38 sub.UnsubscribeAll(); 39 } 40 #endregion
客戶端測試,我將建立一個ConsoleApp和一個Winform程序,並在其中定義兩個按鈕。代碼如下:
在ConsoleApp中我們作為訂閱
1 static void Main(string[] args) 2 { 3 IRedisClient client = new RedisClient(); 4 5 client.RedisSub("myFirstChannel"); 6 client.RedisSub("mySecondChannel"); 7 }
在Winform程序中進行發布
1 IRedisClient client = new RedisClient(); 2 private void button1_Click(object sender, EventArgs e) 3 { 4 client.RedisPub("myFirstChannel", "first"); 5 } 6 7 private void button2_Click(object sender, EventArgs e) 8 { 9 client.RedisPub("mySecondChannel", "second"); 10 }
將兩個應用運行起來,操作以及結果如下:

下面操作兩個按鈕,得到結果。

訂閱成功。
如果我的點滴分享,對您能有一點幫助,歡迎點贊支持,也歡迎大牛們持續關注和給予指導建議。
