Redis的发布订阅及.NET客户端实现

序言

发布订阅在设计模式中也可以说是观察者模式,针对这个模式是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新。

然而它也有自己的缺点,就是当主题发生一系列的变化时,观察者都要做批量的更新,如果这样的更新成本很高,那么解决方法就是根据种类需求通知,而不能盲目的通知所有的观察者。

那针对这个缺点,一般的情况下,你没有需求谁订阅一个跟自己无关的消息推送呢?这也正好说明推送的消息需要整理而不能一窝蜂的什么消息都往一个通道里面抛,要分而治之,合理的设计发布通道的用途,也合理的订阅通道。

那么如此一来,升级到系统项目级别,他别给我们又带来啦,莫大的好处,便是:剥离系统耦合,减少单线功能的依赖关系,又正迎合啦高内聚,松耦合的系统架构设计。

扯拉这么多,只当废话啦,因为我这一篇的序言里面也不知道写什么段子啦,就这样吧。

Redis中的发布/订阅功能

这一节参考官方文档:https://redis.io/topics/pubsub

首先我准备啦1个redis服务,3个客户端,如下图所示:

Redis的发布订阅及.NET客户端实现

然后打开官方文档,首先可以看到以下6个命令,对,就只有这6个命令,只要你能掌握理解,发散思维灵活运用。吐纳,吐纳,那么道于此,生一,生二、生三,生万物,根本不在话下!!C,C,C,WC, 小伙,以后拯救世界就看你啦。

Redis的发布订阅及.NET客户端实现

下面我们使用这几个命令,做一个演示,便于你理解。

1、2个客户端订阅order.create通道消息,如下:

Redis的发布订阅及.NET客户端实现

2、最后一个客户端发布往order.create通道发布消息。如下:

Redis的发布订阅及.NET客户端实现

3、你会立马发现订阅此通道的另外2个客户端有信息输出出来,如下:

Redis的发布订阅及.NET客户端实现

简单不,一个发布订阅的基础功能以及完事啦。

那如果你对其他一些发布订阅管理系统比较了解的话,你立马会想到一个功能,类似rabbitmq中的topic类型的匹配功能。那redis中有吗,就这6个命令,答案是有的。使用的命令为psubscribe。

127.0.0.1:6379> psubscribe *   ---订阅所有通道
127.0.0.1:6379> psubscribe order.*  ---订阅通道名称以order.开头的所有通道消息

那又如何取消订阅过的通道呢?

127.0.0.1:6379> unsubscribe  order.create   ---取消订阅
127.0.0.1:6379> punsubscribe order.*  ---取消订阅通道名称以order.开头的所有通道消息

如何查看订阅信息呢?

127.0.0.1:6379> pubsub channels   ---查看当前服务器订阅的所有通道
127.0.0.1:6379> pubsub channels order.*  ---查看订阅通道名称以order.开头的所有通道
127.0.0.1:6379> pubsub  numsub order.create  user   ---查看订阅order.create 和user 通道的订阅者数量,支持查询多个通道

呀,到此为止,6个命令已经用完啦。就是这么任性,对,你潜心修炼10多分钟已经学会啦redis中最上层的发布订阅技能。你可以出关,打败天下无敌手啦。

StackExchange.Redis实现redis中的发布订阅功能

那这一节呢,我也实在说不出怎么讲更合理点,我就上一个示例,你自己把代码拷贝去,玩玩吧。上代码。

 static void Main(string[] args)
        {
            Console.WriteLine("请输入发布订阅类型?");
            var type = Console.ReadLine();
            if (type == "publish")
            {
                while (true)
                {
                    Console.WriteLine("请输入要发布向哪个通道?");
                    var channel = Console.ReadLine();
                    Console.WriteLine("请输入要发布的消息内容.");
                    var message = Console.ReadLine();
                    sub.Publish(channel, message);
                }
            }
            else
            {
                Console.WriteLine("请输入您要订阅哪个通道的信息?");
                var channelKey = Console.ReadLine();
                sub.Subscribe(channelKey, (channel, message) =>
                {
                    Console.WriteLine("接受到发布的内容为:" + message);
                });
                Console.WriteLine("您订阅的通道为:<< "+ channelKey + " >> ! 一切就绪,等待发布消息!勿动,一动就没啦!!");
                Console.ReadKey();
            }
        }

运行起来几个实例,来玩一玩。如下,5个,1个发布信息,4个订阅信息,其中2个订阅zhanglonghao通道,2个订阅bokeyuan通道。

Redis的发布订阅及.NET客户端实现

第一次我发布消息到zhanglonghao通道,发布的消息为:hello shuaige !!如下:

Redis的发布订阅及.NET客户端实现

可以看出只有订阅zhanglonghao通道的才接受到啦消息。

那再往bokeyuan通道里面发送,hello bokeyuan !

Redis的发布订阅及.NET客户端实现

到此为止,自己玩去吧。

总结

接下来是大家最喜欢的总结内容啦,内容有二,如下:

1、希望能关注我其他的文章。

2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。

Original: https://www.cnblogs.com/knowledgesea/p/6552811.html
Author: 张龙豪
Title: Redis的发布订阅及.NET客户端实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529082/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis时延问题分析及应对

    Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞;当redis的数据量达…

    Linux 2023年5月28日
    092
  • ArrayList中的遍历删除

    例如我们有下列数据,要求遍历列表并删除所有偶数。 List myList = new ArrayList<>(Arrays.toList(new Integer[]{2…

    Linux 2023年6月13日
    095
  • OpenSSL测试-SM3

    任务详情 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 使用OpenSSL的命令计算你的8位学号的摘要值(SM3),提交截图(5’…

    Linux 2023年6月8日
    0111
  • 匿名远程启动jenkins的job

    安装jenkins插件Build Authorization Token Root job配置中的构建触发器,勾选触发远程构建,输入要用的令牌,如soul 通过jenkins地址调…

    Linux 2023年6月6日
    0134
  • zenity,把shell加上图形界面

    有时自己写点小工具自己用,比较喜欢非图形界面的,可是有些应用还是弹出个东西来提醒一下,才能让你注意。 zenity是个很帅的东西,它用法可以参考它的–help ,这里不…

    Linux 2023年5月28日
    092
  • NO.4 计算机组成原理-笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    094
  • WPF 多线程下跨线程处理 ObservableCollection 数据

    本文告诉大家几个不同的方法在 WPF 里,使用多线程修改或创建 ObservableCollection 列表的数据 需要明确的是 WPF 框架下,非 UI 线程直接或间接访问 U…

    Linux 2023年6月6日
    099
  • 40+倍提升,详解 JuiceFS 元数据备份恢复性能优化之路

    JuiceFS 支持多种元数据存储引擎,且各引擎内部的数据管理格式各有不同。为了便于管理,JuiceFS 自 0.15.2 版本提供了 dump 命令允许将所有元数据以统一格式写入…

    Linux 2023年6月14日
    0107
  • Pyinstaller打包教程

    由于用户使用Python脚本的时候可能没有运行环境,所以需要打包。记录下碰到的问题。 安装 pip install –upgrade pyinstaller 安装最新开发版 pi…

    Linux 2023年6月13日
    061
  • 聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架。 它的设计异常优雅简洁,扩展性高,稳定性强。拥有非常详细完整的用户文档。 同时内置…

    Linux 2023年6月6日
    087
  • 在docker中使用主机串口通讯

    在进行软件docker化的过程时,很大的一个阻碍就是软件与各种外围硬件设备的交互,网口通信的设备能够很容易地接入容器,但是串口设备则要复杂一些。本文讨论在windows和linux…

    Linux 2023年6月6日
    0106
  • 防数据泄露_MySQL库和数据安全

    攻击场景 外部入侵 内部盗取 防御体系建设 参考 在企业安全建设中有一个方向是防数据泄露,其中一块工作就是保障数据库安全,毕竟这里是数据的源头。当然数据库也分不同的种类,不同类型的…

    Linux 2023年6月6日
    0106
  • linux编译安装nginx

    本文升级过程,适用于大部分nginx编译版本 常用编译选项说明nginx大部分常用模块,编译时./configure –help以–without开头的都默认安装。 –prefix…

    Linux 2023年5月27日
    086
  • php获取图片的主要颜色值RGB

    public function dominant_color() { $image = 'D:/Python/flow/test_photos/12240303_80d8…

    Linux 2023年6月7日
    0116
  • Linux下侦听端口被占用,怎么解决?

    不知道你有没有遇到过这种问题:在同一台物理机器上,服务A 启动时侦听 端口1 ,同时它也作为客户端去连接 服务B,连接服务B时候会随机一个端口号,假如随机的是 端口2 ,这个时候 …

    Linux 2023年6月13日
    099
  • ES6

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &lt…

    Linux 2023年6月13日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球