
Feb 24 2016
【Redis】Redis Pub/Sub 製作應用程式間推播通知
寫在前面
在很多時候我們的部屬環境是很複雜的,無法使用單一個應用程式來解決我們的問題...(例如:Windows server與Linux Server、多個網站或多個不同類型執行個體、網站搭配console應用程式)此時當應用程式間需要配合時是一個很重要的議題,很多人會把資料存放到資料庫,應用程式在定期去擷取尚未處理的資料,等相關資料處理完畢後再到資料庫注記哪些記錄是已經處理完畢的,在這樣的軟體設計與環境相對簡單許多,但是在系統繁忙的時間中,這可不是一個樂觀的狀態了..
現在Redis具有這樣的功能,可以協助我們設計應用程式間可以互相配合的一個機制,如此一來我們就不需要在透過定期存取資料庫,相關的訊息或相關的資料可以及時的處理!
Redis Command
在使用推播前需要先瞭解三個指令,這三個指令是做應用程式推播時相關的指令
Publish
官網的說明
Available since 2.0.0.
Time complexity: O(N+M) where N is the number of clients subscribed to the receiving channel and M is the total number of subscribed patterns (by any client).
Postss a message to the given channel.
Redis最低版本:2.0 這個指令主要的用途就是將訊息推進某一個頻道中。 而時間複雜度是:O(N+M),N是訂閱這個頻道的Client數量,M是所有訂閱者的數量。
Publish 指令的格式
1Publish [channel] [message] 2
Subscribe
官網的說明
Available since 2.0.0.
Time complexity: O(N) where N is the number of channels to subscribe to.
Subscribes the client to the specified channels.
Redis最低版本:2.0 這個指令主要的用途是訂閱頻道,用來接收訂閱頻道中的訊息。 而時間複雜度是:O(N),N是指要訂閱頻道的總數目
Subscribe指令格式
1SUBSCRIBE [channel 1] [channel 2] ... 2
UnSubscribe
官網的說明
Available since 2.0.0.
Time complexity: O(N) where N is the number of clients already subscribed to a channel.
Unsubscribes the client from the given channels, or from all of them if none is given.
Redis最低版本:2.0 這個指令主要的用途是取消訂閱頻道。 而時間複雜度是:O(N),N是指要取消訂閱頻道的總數目
UnSubscribe指令格式
1UNSUBSCRIBE [channel 1] [channel 2] ... 2
系統開發
存取Redis in C#:StackExchange.Redis
這是一套存取Redis的一個套件,在稍候的程式開發中,都會使用到這個套件來存取Redis!
1Install-Package StackExchange.Redis 2
Subscribe開發
Step1. 連結Redis
在使用Redis需要先建立connection,才能連結到Redis。再使用StackExchange.Redis 套件時需要先引入他的namespace。
1using StackExchange.Redis; 2
設定Redis連線可以參考這篇文章上面會有參數的說明,這邊沒有一一列舉相關的參數設定。
1var configurationOptions = new ConfigurationOptions 2{ 3 AbortOnConnectFail = false, 4 Password = "password", 5 Ssl = false, 6 ConnectTimeout = 6000, 7 SyncTimeout = 6000 8}; 9configurationOptions.EndPoints.Add(new DnsEndPoint("redis host", port)); 10// IP: 11// configurationOptions.EndPoints.Add(IP Address, port)); 12ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(configurationOptions); 13
Step2. 訂閱頻道
在StackExchange.Redis 取得連線後,開始開發訂閱頻道前要先取得Redis的Subcriber,才能發佈或是訂閱訊息
1var sub = redis.GetSubscriber(); 2
在訂閱訊息前,先看一下StackExchange.Redis中Subscribe的說明 第一個參數是頻道名稱,這邊可以直接使用字串來代表RedisChannel的型別,第二個是一個Action的委派型別,第三個是commandFlag,這個主要的用途是在描述指令該如何執行,這個參數可以省略。
這裡做一個範例,我在這裡訂閱了一個Study4TW的頻道,然後指定了收到這個訊息要做哪些事情(寫在Do Something中)
1sub.Subscribe("Study4TW", (channel, message) => 2 { 3 // Do Something 4 }); 5
如此只要寫在系統loading時就可以訂閱到該頻道,這個只要做一次就可以了,不需要每次執行!
Step3. 送出訊息!
送出訊息的指令相當簡單,只要填上你是哪一個頻道,以及你要送出的訊息即可!在RedisChannel與RedisValue兩個型別都可以使用字串來傳遞即可。
1var sub = redis.GetSubscriber(); 2sub.Publish("Study4TW", message); 3
在搭配前面Step2的程式碼,在這樣簡單的範例就可以在應用程序間互相通訊了!就不再需要透過資料庫來做訊息通知了,也不用使用IF去判別這一個訊息要怎麼處理或是交給哪一個method處理,增加程式碼的可讀性!是否受用無窮阿?