设为首页 收藏本站
查看: 1192|回复: 0

[经验分享] Redis的发布订阅及.NET客户端实现

[复制链接]

尚未签到

发表于 2017-12-20 15:43:52 | 显示全部楼层 |阅读模式
序言
  发布订阅在设计模式中也可以说是观察者模式,针对这个模式是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新。
  然而它也有自己的缺点,就是当主题发生一系列的变化时,观察者都要做批量的更新,如果这样的更新成本很高,那么解决方法就是根据种类需求通知,而不能盲目的通知所有的观察者。
  那针对这个缺点,一般的情况下,你没有需求谁订阅一个跟自己无关的消息推送呢?这也正好说明推送的消息需要整理而不能一窝蜂的什么消息都往一个通道里面抛,要分而治之,合理的设计发布通道的用途,也合理的订阅通道。
  那么如此一来,升级到系统项目级别,他别给我们又带来啦,莫大的好处,便是:剥离系统耦合,减少单线功能的依赖关系,又正迎合啦高内聚,松耦合的系统架构设计。
  扯拉这么多,只当废话啦,因为我这一篇的序言里面也不知道写什么段子啦,就这样吧。

Redis中的发布/订阅功能
  这一节参考官方文档:https://redis.io/topics/pubsub
  首先我准备啦1个redis服务,3个客户端,如下图所示:
DSC0000.png

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

  下面我们使用这几个命令,做一个演示,便于你理解。
  1、2个客户端订阅order.create通道消息,如下:
DSC0002.png

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

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

  简单不,一个发布订阅的基础功能以及完事啦。
  那如果你对其他一些发布订阅管理系统比较了解的话,你立马会想到一个功能,类似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通道。
DSC0005.png

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

  可以看出只有订阅zhanglonghao通道的才接受到啦消息。
  那再往bokeyuan通道里面发送,hello bokeyuan !
DSC0007.png

  到此为止,自己玩去吧。

总结
  接下来是大家最喜欢的总结内容啦,内容有二,如下:
  1、希望能关注我其他的文章。
  2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426094-1-1.html 上篇帖子: Redis构建分布式锁 下篇帖子: redis 简单使用总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表