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)

大家都在看

  • 软件工程 软件需求与软件需求规约 第1篇随笔

    2、软件需求与软件需求规约 1. 何为需求? 定义问题的基本要素是 “需求” 一个需求是一个有关”要予构造”的陈述,用以描述待开发产…

    Linux 2023年6月7日
    093
  • jedisLock—redis分布式锁实现

    一、使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现) 共享资源(各个系统访问同…

    Linux 2023年5月28日
    085
  • KMS官网链接(无毒)

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

    Linux 2023年6月7日
    086
  • 继承、封装、多态的实现原理

    欢迎来到Java学习之继承、封装、多态的实现原理 目录 从JVM结构开始谈多态 JVM 的结构 Java 的方法调用方式 常量池(constant pool) 图 2. 常量池各表…

    Linux 2023年6月13日
    096
  • ubuntu redis 集群配置

    1.下载并编译redis 去http://download.redis.io/releases/查看自己想要下载的redis,右键复制一下链接我的原始目录:/root wget h…

    Linux 2023年6月7日
    0103
  • [20211217]滑稽可笑的程序代码2.txt

    [20211217]滑稽可笑的程序代码2.txt –//实在不知道如何取标题..感觉很无奈无语… –//昨天上午快下班的时候我使用ashtop看…

    Linux 2023年6月13日
    070
  • WPF 已知问题 资源字典树引用与资源寻找的坑

    大家都知道,在 WPF 里面,可以让资源字典合并其他资源字典,从而定义出资源字典引用树。然而在资源字典引用树里面,如果没有理清关系,将可以作出一个超级复杂的引用关系网。如果在性能优…

    Linux 2023年6月6日
    096
  • OSPF之Default-router-advertise 解析

    1、关于default-route-advertise命令 Ospf是可以通过import-route命令引入外部路由的,但很少有人会注意到,在默认情况下,ospf是不会引入来自外…

    Linux 2023年6月14日
    088
  • freePBR的UE4材质合集

    我手动下载了freepbr.com上的所有ue4材质,放到百度云上分享给大家。 freePBR的UE4材质合集 想开个新坑了。但工欲善其事必先利其器。于是我手动下载了freepbr…

    Linux 2023年6月6日
    085
  • 常用的分布式锁和redis和zk两种分布式锁的对比

    常用的分布式锁 一、基于数据库实现分布式锁 1. 悲观锁 利用select … where … for update 排他锁 注意: 其他附加功能与实现一基…

    Linux 2023年5月28日
    071
  • Struts2-045漏洞

    前言 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图…

    Linux 2023年6月14日
    095
  • 用无感知的方式为你的数据加上一层缓存

    前言 本篇文章会介绍一个我自己写的库,库地址在这里,主要作用是提供一个注解,在你方法上使用这个注解,库提供的功能会帮你把数据自动缓存起来,下次再调用这个方法只要入参是一致的则直接会…

    Linux 2023年6月14日
    0123
  • [数据库]ACID、CAP、BASE特性

    SQL与noSQL 对比项 关系型SQL 非关系型SQL 关系表 数据集(键值/JSON文档/哈希表/其它) 结构化、提前定义表结构 动态调整模式,非结构化 纵向扩展,提高处理能力…

    Linux 2023年6月13日
    082
  • linux之ifconfig查看ip

    ifconfig 用于显示或设置网络设备。 设置网络设备的状态和信息 [En] set the status and information of network devices*…

    Linux 2023年5月27日
    0118
  • Linux基础02

    import paramiko class SSHProxy(object): def __init__(self, hostname, port, username, passw…

    Linux 2023年6月7日
    074
  • 2021年3月-第02阶段-前端基础-HTML+CSS阶段-Day03

    HTML5 第三天 一、 认识 3D 转换 3D 的特点 近大远小 物体和面遮挡不可见 三维坐标系 x 轴:水平向右 — 注意:x 轴右边是正值,左边是负值 y 轴:垂…

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