当前位置: 首页 > news >正文

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

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

序言

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

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

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

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

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

Redis中的发布/订阅功能

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

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

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

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

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

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

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

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

那如果你对其他一些发布订阅管理系统比较了解的话,你立马会想到一个功能,类似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通道。

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

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

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

到此为止,自己玩去吧。

总结

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

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

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

相关文章:

  • 动态载入数据的无刷新TreeView控件(8)
  • ubuntu-基本命令篇-13-用户管理
  • 四大中三家已面向客户推出机器人业务解决方案?别逗了,先用机器人自我革命吧! post by 上海嘉冰信息技术...
  • python基础实践(二)
  • [Spring Cloud Task]3 框架配置详解
  • node.js
  • 本周末预计更新博客内容
  • 微信开发https服务搭建
  • wii 入门之路--fatt
  • 冒泡排序的多种写法、逻辑
  • 获取 Android 版本
  • 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  • 当微信小程序遇上filter~
  • webpack 简单使用
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • 自己简单写的 事件订阅机制
  • [deviceone开发]-do_Webview的基本示例
  • 《深入 React 技术栈》
  • 【翻译】babel对TC39装饰器草案的实现
  • ERLANG 网工修炼笔记 ---- UDP
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Phpstorm怎样批量删除空行?
  • React-Native - 收藏集 - 掘金
  • scala基础语法(二)
  • win10下安装mysql5.7
  • 阿里云Kubernetes容器服务上体验Knative
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 力扣(LeetCode)22
  • 你不可错过的前端面试题(一)
  • 一份游戏开发学习路线
  • 栈实现走出迷宫(C++)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (04)odoo视图操作
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)3D模板阴影原理
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .bashrc在哪里,alias妙用
  • .Family_物联网
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 6 集成和使用 mongodb
  • .NET 药厂业务系统 CPU爆高分析
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net转Java自学之路—基础巩固篇十三(集合)