寫在前面

在很多時候我們的部屬環境是很複雜的,無法使用單一個應用程式來解決我們的問題…(例如: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).

Posts a message to the given channel.

Redis最低版本:2.0
這個指令主要的用途就是將訊息推進某一個頻道中。
而時間複雜度是:O(N+M),N是訂閱這個頻道的Client數量,M是所有訂閱者的數量。

Publish 指令的格式

1
Publish [channel] [message]

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指令格式

1
SUBSCRIBE [channel 1] [channel 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指令格式

1
UNSUBSCRIBE [channel 1] [channel 2] ...

系統開發

存取Redis in C#:StackExchange.Redis

這是一套存取Redis的一個套件,在稍候的程式開發中,都會使用到這個套件來存取Redis!

1
Install-Package StackExchange.Redis

Subscribe開發

Step1. 連結Redis

在使用Redis需要先建立connection,才能連結到Redis。再使用StackExchange.Redis 套件時需要先引入他的namespace。

1
using StackExchange.Redis;

設定Redis連線可以參考這篇文章上面會有參數的說明,這邊沒有一一列舉相關的參數設定。

1
2
3
4
5
6
7
8
9
10
11
12
var configurationOptions = new ConfigurationOptions
{
AbortOnConnectFail = false,
Password = "password",
Ssl = false,
ConnectTimeout = 6000,
SyncTimeout = 6000
};
configurationOptions.EndPoints.Add(new DnsEndPoint("redis host", port));
// IP:
// configurationOptions.EndPoints.Add(IP Address, port));
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(configurationOptions);

Step2. 訂閱頻道

在StackExchange.Redis 取得連線後,開始開發訂閱頻道前要先取得Redis的Subcriber,才能發佈或是訂閱訊息

1
var sub = redis.GetSubscriber();

在訂閱訊息前,先看一下StackExchange.Redis中Subscribe的說明
第一個參數是頻道名稱,這邊可以直接使用字串來代表RedisChannel的型別,第二個是一個Action的委派型別,第三個是commandFlag,這個主要的用途是在描述指令該如何執行,這個參數可以省略。

Subscribe的說明
Subscribe的說明

這裡做一個範例,我在這裡訂閱了一個Study4TW的頻道,然後指定了收到這個訊息要做哪些事情(寫在Do Something中)

1
2
3
4
sub.Subscribe("Study4TW", (channel, message) =>
{
// Do Something
});

如此只要寫在系統loading時就可以訂閱到該頻道,這個只要做一次就可以了,不需要每次執行!

Step3. 送出訊息!

送出訊息的指令相當簡單,只要填上你是哪一個頻道,以及你要送出的訊息即可!在RedisChannel與RedisValue兩個型別都可以使用字串來傳遞即可。

Publish的說明
Publish的說明
1
2
var sub = redis.GetSubscriber();
sub.Publish("Study4TW", message);

在搭配前面Step2的程式碼,在這樣簡單的範例就可以在應用程序間互相通訊了!就不再需要透過資料庫來做訊息通知了,也不用使用IF去判別這一個訊息要怎麼處理或是交給哪一個method處理,增加程式碼的可讀性!是否受用無窮阿?

參考資料

Redis Pub/Sub

Publish - Redis

Subscribe - Redis

UnSubscribe - Redis

StackExchange.Redis GitHub

StackExchange.Redis nuget