天天看點

C#的StackExchange.Redis實作訂閱分發模式

使用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)

五、測試結果

繼續閱讀