序言

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

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

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

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

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

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:> psubscribe *   ---订阅所有通道
127.0.0.1:> psubscribe order.* ---订阅通道名称以order.开头的所有通道消息

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

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

如何查看订阅信息呢?

127.0.0.1:> pubsub channels   ---查看当前服务器订阅的所有通道
127.0.0.1:> pubsub channels order.* ---查看订阅通道名称以order.开头的所有通道
127.0.0.1:> 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个交流群,我们一起学习探讨。

Redis的发布订阅及.NET客户端实现的更多相关文章

  1. redis的发布订阅模式

    概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer {     /* Pubsub */     // 字典,键为频道, ...

  2. StackExchange.Redis 使用-发布订阅 (二)

    使用Redis的发布订阅功能 redis另一个常见的用途是发布订阅功能 . 它非常的简单 ,当连接失败时 ConnectionMultiplexer 会自动重新进行订阅 . ISubscriber s ...

  3. .net core 使用Redis的发布订阅

    Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来使用,但是他不仅仅可以用来作为缓存,比如著名的分布式框架dubbo就可以用Redis来做服务注册中心.接下来介绍一下.net core 使用 ...

  4. redis的发布订阅模式pubsub

    前言 redis支持发布订阅模式,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个 ...

  5. java实现 redis的发布订阅(简单易懂)

    redis的应用场景实在太多了,现在介绍一下它的几大特性之一   发布订阅(pub/sub). 特性介绍: 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publ ...

  6. redis的发布订阅、持久化存储、redis的主从复制

    redis的发布订阅 1. 创建redis配置文件 vim /opt/redis_conf/reids-6379.conf mkdir /data/6379 redis-server  redis-6 ...

  7. Redis之发布订阅

    一 什么是发布订阅 发布订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将得到通知 Redis 发布订阅(pub/sub)是一种消息通信模式: ...

  8. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  9. redis(3)发布订阅

    一.发布/订阅模式 在软件工程里面,发布/订阅是一种消息模式,这种模式旨在将消息发送者和消息接收者解耦.发送者不需要关心将消息发送给谁,接收者也不需要知道消息的发送者是谁.发送者将消息发布以后就结束动 ...

随机推荐

  1. jQuery disabled 元素

    http://www.jb51.net/article/19342.htm 在jquery中可以通过jqueryObj.attr("disabled","disabled ...

  2. CCNA网络工程师学习进程(9)GNS3的安装与配置

        本节将简单介绍一下网络设备模拟软件GNS3的配置和使用方法.     (1)GNS3概述: GNS3是一款具有图形化界面可以运行在多平台(包括Windows, Linux, and MacOS ...

  3. IE的缓存

    例:在IE中缓存是很难清掉的,用户也不会每次都给你点清理缓存,那是开发人员自己开发才会干的事,所以我们在对接数据的时候,最好采用异步刷新的方式,获取最新数据 方法如下: // 异步刷新,针对IE缓存的 ...

  4. 关于多字节字符入库失败处理(所谓的Emji),该处理是舍弃特殊字符

    具体处理方法及样例如下: /** * 屏蔽超过三个字节以上的字符 * @param strByte * @return */ public static String filterUtf8(byte[ ...

  5. Flux --> Redux --> Redux React 入门

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  6. android: activity之间切换的抽屉效果

    之前一直用的是向左平移和向右平移的切换动画,看到别的APP那个抽屉效果,自己也弄了一个!感谢给我提供帮助的大神们! 将退出动画的参数设置为0时,进入动画则设置为向左平移,就实现了抽屉效果! 进入的动画 ...

  7. Windows下Python读取GRIB数据

    之前写了一篇<基于Python的GRIB数据可视化>的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明. 一.在Windows下Python为什么无法 ...

  8. Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

    前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...

  9. GIT团队开发操作

    01. 建立代码仓库(专门用于团队开发的代码仓库) ========================================================================== ...

  10. sed 命令详解

    sed 用于筛选和转换文本的流编辑器 描述: sed是一个流编辑器,流编辑器对一个输入流执行基本的文本转换(输入流来自文件或者管道行).虽然在某些方面类似于很多可运行脚本的编辑器,但是sed的工作方式 ...