Redis学习笔记~分布式的Pub/Sub模式
redis的客户端有很多,这次用它的pub/sub发布与订阅我选择了StackExchange.Redis,发布与订阅大家应该很清楚了,首先一个订阅者,订阅一个服务,服务执行一些处理程序(可能是写个日志,插入个数据,发个email)然后当另一个项目的某个业务发布这个服务后,被订阅的程序将会被执行,这个听起来很有意思,redis有好的实现了这个pub/sub功能。
看一下结构图
Sub订阅(消息消费者)
对于订阅方,这里类似于一个服务,它会长期运行着,被启动后动态订阅一些服务进来,以便以后再被其它服务调用
//sub a function in A-projectPubSubManager.Instance.Subscribe("UserLog", (msg) =>{//订阅者处理自己的业务逻辑,这相关于队列服务要干的事 Console.WriteLine(msg);});
Pub发布(消息生产者)
而对于其它项目,如A网站,它可能在被在POST动作后发布这个UserLog的服务,这时上面的订阅方将会消费它(消费者模式),或者服务代码被执行!
[HttpPost]public ActionResult Index(string user){PubSubManager.Instance.Publish("UserLog", user + "这个用户提交表单了");return View();}
对于一直运行的服务,将会收到来自不同项目的消息,而它只负责消费它!
Lind.DDD.PublishSubscribe
封装了一些标准的pub/sub方法,它可以有多种实现方法,本例使用redis这个中间件
/// <summary>/// 发布订阅的接口规则/// </summary>public interface IPubSub{/// <summary>/// 发布,有顺序,对象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void Publish(string channel, string value);/// <summary>/// 订阅,对象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void Subscribe(string channel, Action<string> action);/// <summary>/// 异步发布,无顺序,对象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishAsync(string channel, string value);/// <summary>/// 异步订阅,无顺序,对象源是字符串/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeAsync(string channel, Action<string> action);/// <summary>/// 发布,有顺序,对象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishByte(string channel, byte[] value);/// <summary>/// 订阅,对象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeByte(string channel, Action<byte[]> action);/// <summary>/// 异步发布,有顺序,对象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="value"></param>void PublishByteAsync(string channel, byte[] value);/// <summary>/// 异步订阅,对象源是Byte[]/// </summary>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeByteAsync(string channel, Action<byte[]> action);/// <summary>/// 发布,有顺序,对象源是泛型对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="value"></param>void Publish<T>(string channel, T value);/// <summary>/// 订阅,对象源是泛型对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="action"></param>void Subscribe<T>(string channel, Action<T> action);/// <summary>/// 异步发布,有顺序,对象源是泛型对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="value"></param>void PublishAsync<T>(string channel, T value);/// <summary>/// 异步订阅,对象源是泛型对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="action"></param>void SubscribeAsync<T>(string channel, Action<T> action);/// <summary>/// 取消指定订阅/// </summary>/// <param name="channel"></param>void UnSubscribe(string channel);/// <summary>/// 取消所有订阅/// </summary>/// <param name="channel"></param>void UnSubscribeAll();}
本文转自博客园张占岭(仓储大叔)的博客,原文链接:Redis学习笔记~分布式的Pub/Sub模式,如需转载请自行联系原博主。
Redis学习笔记~分布式的Pub/Sub模式相关推荐
- Redis 学习笔记八:集群模式
Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...
- Redis 学习笔记十 发布者订阅者模式与生产者消费者模式
消息队列有两种场景 生产者消费者:一个消息只能有一个消费者 发布者订阅者:一个消息可以被多个消费者收到 redis从2.0版本开始支持pub/sub. 而Producer/Consumer是借助于re ...
- Redis学习笔记---Redis的模式订阅与退订
Redis学习笔记-Redis的模式订阅与退订 1.发布订阅简介 发布订阅是一种通信的模式,Redis提供了发布订阅功能,可以用于消息的传输 Redis的发布订阅机制包括三个部分,publisher( ...
- Redis学习笔记1-理论篇
目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...
- Redis学习笔记(B站狂神说)(自己总结方便复习)
Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...
- Redis(学习笔记)
Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...
- StackExchange.Redis学习笔记(五) 发布和订阅
StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...
- Redis学习笔记(五)——持久化及redis.conf配置文件叙述
对于日常使用来说,学习完SpringBoot集成Redis就够我们工作中使用了,但是既然学习了,我们就学习一些Redis的配置及概念,使我们可以更深层次的理解Redis,以及增强我们的面试成功概率,接 ...
- Redis学习笔记(实战篇)(自用)
Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...
最新文章
- Unity3d游戏开发之漫游场景的制作
- Intuit的Alex Balazs访谈
- xcode更新之后插件失效的解决办法
- linux关机方法有哪些?有何区别_Linux下判断是否正常关机的一个简单方法
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 完美解决(tomcat error)
- Hadoop之HDFS应用
- python multithreading_操作系统OS,Python - 多进程(multiprocessing)、多线程(multithreading)...
- MFC中模态对话框和非模态对话框的差别
- 黄轩成为QQ阅读新代言人 变身“队长”号召网友 “组队读书”
- JAVA团队开发手册 - 2.代码管理
- python可打印字符_测试一个python字符串是否可打印
- 可编程逻辑控制器类毕业论文文献都有哪些?
- CSS - less
- 三星s9刷android9,三星S9港版安卓9rom系统线刷包:TGY-G9600ZHU5CSG8-刷机之家
- 手机科学计算机xy怎么用,如何使用科学计算器
- SAP MM 采购订单中“Delivery Completed“ Indicator
- 东大计算机硕士奖学金,计算机科学与技术学院2018级硕士研究生学业奖学金评定情况.PDF...
- mac mysql 没有my.cnf_mac下mysql配置my.cnf无效
- noise levels descript
- 【大数据技术】实验4:熟悉Spark基础编程
热门文章
- python 发起HTTP请求
- Lattice 的 Framebuffer IP核使用调试笔记之datasheet笔记
- c++ 读取文件 最后一行读取了两次
- Android 绑定远程服务出现 Not Allowed to bind service
- html中dd dt的效果,html中dt dd
- c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗
- 工业机器人 扬州 江都_扬州市14家企业获批2019年江苏省示范智能车间
- java for循环的这种写法怎么理解:for (; ; ) {},
- h2 mysql 兼容_H2内存数据库对sql语句的支持问题 sql放到mysql数据库中能跑
- 100个网络基础知识,赶紧收藏吧!