使用C#的StackExchange.Redis實作訂閱分發模式
wu大糊塗關注
一、訂閱分發模式介紹
Redis釋出訂閱—Pub/Sub模式或者說是觀察者模式。我想大家即使沒有使用過,也已經耳熟能詳了。
先簡單舉例說明下應用場景,在場景中我們可以分析到其優勢在哪。
比如你的線上應用應用,你想設定一個日志報警系統,當應用出現異常的時候,立馬發送通知給你,可能是短信的形式,也可能是郵件的形式。當然如果隻将報警通知給你一個人,實作起來很簡單,在報警系統中将你的手機号和短信寫死在程式中。但是如果你的項目龐大,每個子產品有各自的負責人,并且負責人也經常會變更,那麼咱們就不能總修改代碼了吧?
或者說你的個人部落格可以讓讀者訂閱,讀者這麼多,咱們根本控制不過來呀。
現在釋出訂閱模式,就可以解決你的問題。在某一點發生改變的時候,其他用戶端立即得到通知。也可以說訂閱伺服器得到應用釋出消息,由伺服器立即通知給你手中的用戶端。這樣的好處就是一種松耦合的模式,你不再需要修改釋出端和訂閱端的任何代碼,你隻要提供好釋出和訂閱的操作接口,今後調用就可以了。
二、Redis幫助類
1、連接配接redis資料庫
public static ConnectionMultiplexer Manager
private static ConnectionMultiplexer GetManager(string connectionString=null){
if(string.IsNullOrEmpty(connectionString)){
connectionString = "127.0.0.1";
}
return ConnectionMultiplexer.Connect(connectionString);
}
2、釋出函數
public long RedisPub(string channel, T msg){
ISubscriber sub = Manager.GetSubscriber();
return sub.Publish(channel, SerializeContent(msg));
}
3、訂閱函數
訂閱函數的回調函數的輸入參數為得到的消息
public void RedisSub(string subChannael,Actioncallback){
ISubscriber sub = Manager.GetSubscriber();
sub.Subscribe(subChannael, (channel, message) =>{
Console.WriteLine(channel+":"+message);
callback(message);
});
}
4、取消訂閱函數
public void Unsubscribe(string channel){
ISubscriber sub = Manager.GetSubscriber();
sub.Unsubscribe(channel);
}
5、取消所有訂閱函數
public void UnsubscribeAll(){
ISubscriber sub = Manager.GetSubscriber();
sub.UnsubscribeAll();
}
三、訂閱用戶端程式
1、Main函數
static void Main(string[] args){
RedisHelp.RedisHelp client = new RedisHelp.RedisHelp();
client.RedisSub("myFirstChannel", SubCallBack);
client.RedisSub("mySecondChannel");
Console.ReadLine();
}
2、消息回調函數
隻有當收到消息時,回調函數被調用,不用使用另外的線程來循環訂閱。訂閱隻需要一次即可。
private static void SubCallBack(string msg){
Console.WriteLine("Cliect1:{0}",msg);
}
四、釋出用戶端程式
1、背景代碼
private void button1_Click(object sender, EventArgs e){
client.RedisPub("myFirstChannel", textBox1.Text);
}
2、UI界面(winform)
五、測試結果