zoukankan      html  css  js  c++  java
  • 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)

    五、测试结果

    发布客户端发送A,订阅客户端接收到A,第一个接收结果是RedisHelp库中的函数打印的,第二个是库函数调用回调函数打印的。

  • 相关阅读:
    NOIP201208同余方程
    NOIP模拟赛 最佳组合
    NOIP模拟赛 拓展
    CF1253E Antenna Coverage(DP)
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
    CF582E Boolean Function(DP,状态压缩,FMT)
    CF750G New Year and Binary Tree Paths(DP)
    Codeforces Round 596 题解
    AGC008E Next or Nextnext(组合计数,神奇思路)
    ARC082E ConvexScore(神奇思路)
  • 原文地址:https://www.cnblogs.com/grj001/p/12223004.html
Copyright © 2011-2022 走看看