RedisRepository封裝—Redis發布訂閱以及StackExchange.Redis中的使用


本文版權歸博客園和作者本人吳雙共同所有,轉載請注明本Redis系列分享地址。http://www.cnblogs.com/tdws/tag/NoSql/

Redis Pub/Sub模式 基本介紹

Redis發布訂閱—Pub/Sub模式或者說是觀察者模式。我想大家即使沒有使用過,也已經耳熟能詳了。

先簡單舉例說明下應用場景,在場景中我們可以分析到其優勢在哪。

比如你的線上應用應用,你想設置一個日志報警系統,當應用出現異常的時候,立馬發送通知給你,可能是短信的形式,也可能是郵件的形式。當然如果只將報警通知給你一個人,實現起來很簡單,在報警系統中將你的手機號和短信寫死在程序中。但是如果你的項目龐大,每個模塊有各自的負責人,並且負責人也經常會變更,那么咱們就不能總修改代碼了吧?

或者說你的個人博客可以讓讀者訂閱,讀者這么多,咱們根本控制不過來呀。

現在發布訂閱模式,就可以解決你的問題。在某一點發生改變的時候,其他客戶端立即得到通知。也可以說訂閱服務器得到應用發布消息,由服務器立即通知給你手中的客戶端。這樣的好處就是一種松耦合的模式,你不再需要修改發布端和訂閱端的任何代碼,你只要提供好發布和訂閱的操作接口,今后調用就可以了。

首先看一下Redis在控制台中的發布訂閱操作。

我開啟兩個redis命令客戶端對相同的一個redis服務進行操作。

首先我們在第一個客戶端我們對message01進行訂閱,channel名稱是我們自定義的,訂閱哪個就是哪個。

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

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

StackExchange.Redis操作發布訂閱

畢竟我們不可能只將其用在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         }

將兩個應用運行起來,操作以及結果如下:

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

 

訂閱成功。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM