zoukankan      html  css  js  c++  java
  • RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

    本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址。http://www.cnblogs.com/tdws/tag/NoSql/

    Redis Pub/Sub模式 基本介绍

    Redis发布订阅—Pub/Sub模式或者说是观察者模式。我想大家即使没有使用过,也已经耳熟能详了。

    先简单举例说明下应用场景,在场景中我们可以分析到其优势在哪。

    比如你的线上应用应用,你想设置一个日志报警系统,当应用出现异常的时候,立马发送通知给你,可能是短信的形式,也可能是邮件的形式。当然如果只将报警通知给你一个人,实现起来很简单,在报警系统中将你的手机号和短信写死在程序中。但是如果你的项目庞大,每个模块有各自的负责人,并且负责人也经常会变更,那么咱们就不能总修改代码了吧?

    或者说你的个人博客可以让读者订阅,读者这么多,咱们根本控制不过来呀。

    现在发布订阅模式,就可以解决你的问题。在某一点发生改变的时候,其他客户端立即得到通知。也可以说订阅服务器得到应用发布消息,由服务器立即通知给你手中的客户端。这样的好处就是一种松耦合的模式,你不再需要修改发布端和订阅端的任何代码,你只要提供好发布和订阅的操作接口,今后调用就可以了。

    首先看一下Redis在控制台中的发布订阅操作。

    我开启两个redis命令客户端对相同的一个redis服务进行操作。

    首先我们在第一个客户端我们对message01进行订阅,channel名称是我们自定义的,订阅哪个就是哪个。

    其次,我们在第二个客户端对message01这个channel进行发布消息。返回值表示有几个客户端订阅。

    发布消息后,订阅的客户端立即受收到消息。

    StackExchange.Redis操作发布订阅

    毕竟我们不可能只将其用在Redis命令控制台哈,最后来看一下在.NET中的使用。我们依然借助StackExchange.

    基础配置,本系列第一篇分享已经包含。还记得静态构造函数中,下面这段代码吗?

    1 _redis.PreserveAsyncOrder = RedisClientConfigurations.PreserveAsyncOrder;//并行

    配置中,定义了使用并行的方式来执行命令,大大提高了效率(在你无所谓消息传递的顺序时,可以这样使用)。

    在接口中定义如下方法:

     1  #region Redis发布订阅
     2         /// <summary>
     3         /// Redis发布订阅  订阅
     4         /// </summary>
     5         /// <param name="subChannel"></param>
     6         void RedisSub(string subChannel);
     7         /// <summary>
     8         /// Redis发布订阅  发布
     9         /// </summary>
    10         /// <typeparam name="T"></typeparam>
    11         /// <param name="channel"></param>
    12         /// <param name="msg"></param>
    13         /// <returns></returns>
    14         long RedisPub<T>(string channel, T msg);
    15         /// <summary>
    16         /// Redis发布订阅  取消订阅
    17         /// </summary>
    18         /// <param name="channel"></param>
    19         void Unsubscribe(string channel);
    20         /// <summary>
    21         /// Redis发布订阅  取消全部订阅
    22         /// </summary>
    23         void UnsubscribeAll();
    24 
    25         #endregion

    实现如下:

     1  #region Redis发布订阅
     2         /// <summary>
     3         /// Redis发布订阅  订阅
     4         /// </summary>
     5         /// <param name="subChannel"></param>
     6         public void RedisSub(string subChannel)
     7         {
     8             sub.Subscribe(subChannel, (channel, message) =>
     9             {
    10                 Console.WriteLine((string)message);
    11             });
    12         }
    13         /// <summary>
    14         /// Redis发布订阅  发布
    15         /// </summary>
    16         /// <typeparam name="T"></typeparam>
    17         /// <param name="channel"></param>
    18         /// <param name="msg"></param>
    19         /// <returns></returns>
    20         public long RedisPub<T>(string channel, T msg)
    21         {
    22 
    23             return sub.Publish(channel, SerializeContent(msg));
    24         }
    25         /// <summary>
    26         /// Redis发布订阅  取消订阅
    27         /// </summary>
    28         /// <param name="channel"></param>
    29         public void Unsubscribe(string channel)
    30         {
    31             sub.Unsubscribe(channel);
    32         }
    33         /// <summary>
    34         /// Redis发布订阅  取消全部订阅
    35         /// </summary>
    36         public void UnsubscribeAll()
    37         {
    38             sub.UnsubscribeAll();
    39         }
    40         #endregion

    客户端测试,我将建立一个ConsoleApp和一个Winform程序,并在其中定义两个按钮。代码如下:

    在ConsoleApp中我们作为订阅

    1      static void Main(string[] args)
    2         {
    3             IRedisClient client = new RedisClient();
    4 
    5             client.RedisSub("myFirstChannel");
    6             client.RedisSub("mySecondChannel");
    7          }          

    在Winform程序中进行发布

     1  IRedisClient client = new RedisClient();
     2         private void button1_Click(object sender, EventArgs e)
     3         {
     4             client.RedisPub("myFirstChannel", "first");
     5         }
     6 
     7         private void button2_Click(object sender, EventArgs e)
     8         {
     9             client.RedisPub("mySecondChannel", "second");
    10         }

    将两个应用运行起来,操作以及结果如下:

    下面操作两个按钮,得到结果。

    订阅成功。

    如果我的点滴分享,对您能有一点帮助,欢迎点赞支持,也欢迎大牛们持续关注和给予指导建议。

  • 相关阅读:
    利用mybatis-generator自动生成代码
    gradle安装
    有关﹤![CDATA[ ]]> 说明
    mysql时间字段转换为毫秒格式
    string 与BigDecimal互转
    VLOOKUP多条件查找不使用辅助列
    BIEE-CSS样式大全
    VBA【遍历每个工作表并将工作表表名赋予B2单元格】
    深入理解公式{1,0}的用法
    DB2解锁
  • 原文地址:https://www.cnblogs.com/tdws/p/5827704.html
Copyright © 2011-2022 走看看