Redis系列(三)-Redis发布订阅及客户端编程
阅读目录
发布订阅模型
在应用级其作用是为了减少依赖关系,通常也叫观察者模式。主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方。
发送方:只负责向第三方发送消息。(杂志社把读者杂志交给邮局)
接收方:被动接收消息。(1:向邮局订阅读者杂志,2:门口去接邮过来的杂志)
第三方作用是:存储订阅杂志的接收方,并在杂志过来时送给接收方。 (邮局)
C#示例,发送方把杂志放到邮局里面:
if (QA.AddBug())
EmailNotify();
接收方到邮局登记地址,有杂志过来时送货上门:
EmailNotify += () => { Console.WriteLine("A君"); };
EmailNotify += () => { Console.WriteLine("B君"); };
第三方邮局接受读者杂志订阅,收到杂志时进行派送:
public delegate void MessageHandler();
public static event MessageHandler EmailNotify; if (QA.AddBug())
EmailNotify();
当我们把观察者模式放大到系统级时,就是发布订阅(pub/sub)了。 主要是用来降低发布者和订阅者的耦合,提高前端系统吞吐量。结构如图:

Redis中的发布订阅
Redis实现完整的发布订阅范式,就是说任何一台redis服务器,启动后都可以当做发布订阅服务器。
普通订阅
启动订阅者client。
redis-cli.exe -h 127.0.0.1 -p
订阅bar频道。格式:SUBSCRIBE name1 name2。
成功订阅回复,分别对应订阅类型、订阅频道、订阅数量。
127.0.0.1:> SUBSCRIBE bar
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "bar"
) (integer)
新起个发布者client,发送消息。格式:publish channelName Message。
127.0.0.1:> publish bar val
(integer)
订阅client回复,分别对应消息类型,频道,消息。
) "message"
) "bar"
) "val"
图例

模式订阅
Redis支持模式匹配订阅,*为模糊匹配符。
订阅所有频道的消息
PSUBSCRIBE *
订阅以news.开头的所有频道。
PSUBSCRIBE news.*
取消订阅
取消普通订阅和取消模式订阅的命令。
UNSUBSCRIBE bar
PUNSUBSCRIBE ba*
取消在官方提供的连接工具中无法模拟的。
查看订阅信息
查看订阅消息是redis在2.8中心增加的命令之一。
pubsub channels [pattern] 。
返回当前服务器被订阅的所有频道。
127.0.0.1:> pubsub channels
) "bar"
指定匹配参数,返回与模式匹配的所有频道。
127.0.0.1:> pubsub channels ba*
) "bar"
pubsub numsub [channel-1 channel-2 ...channel-n]
接受任意多个频道作为输入参数,返回这些频道的订阅者数量。
127.0.0.1:> pubsub numsub bar bar2
) "bar"
) (integer)
) "bar2"
) (integer)
客户端编程示例
RedisPubSub client = new RedisPubSub("127.0.0.1", );
client.OnUnSubscribe += (obj) => {
Console.WriteLine();
};
client.OnMessage = (sender, arcgs) =>{
Console.WriteLine(arcgs);
};
client.OnError = (Exception) => {
Console.WriteLine(Exception.Message);
};
client.Subscribe("bar");
Console.ReadLine();
0.3版本HRedis
基本使用
using (RedisClient client = new RedisClient("127.0.0.1", ))
{
client.Set("key", "value");
client.Get("key");
}
使用连接池,自动回收连接。
PoolRedisClient prc = new PoolRedisClient(new PoolConfiguration());
prc.Single.Set("key", "value");
prc.Single.Get("key");
及上面的订阅。
开源地址 https://github.com/mushroomsir/HRedis
Redis系列(三)-Redis发布订阅及客户端编程的更多相关文章
- ActiveMQ入门系列三:发布/订阅模式
在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...
- rabbitmq系列三 之发布/订阅
1.发布/订阅 在上篇教程中,我们搭建了一个工作队列,每个任务只分发给一个工作者(worker).在本篇教程中,我们要做的跟之前完全不一样 —— 分发一个消息给多个消费者(consumers).这种模 ...
- Redis系列三 Redis数据类型
一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...
- 第三百零一节,python操作redis缓存-管道、发布订阅
python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- Redis系列之----Redis的数据类型及使用场景
Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,能够提供多种不同的键值数据类型来适应不同场景下的缓存和存储需求. Redis中所有的数据都存储在内存中,因此读写速度非常快,相 ...
- Redis系列(一):Redis的简介与安装
原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...
- Redis系列一 Redis安装
Redis系列一 Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt root@ubunt ...
- Redis系列(八):发布与订阅
Redis的发布与订阅,有点类似于消息队列,发送者往频道发送消息,频道的订阅者接收消息. 1. 发布与订阅示例 首先,在本机开启第1个Redis客户端,执行如下命令订阅blog.redis频道: SU ...
随机推荐
- RabbitMQ的几种应用场景
RabbitMQ是一个消息代理,从“生产者”接收消息并传递消息至“消费者”,期间可根据规则路由.缓存.持久化消息.“生产者”也即message发送者以下简称P,相对应的“消费者”乃message接收者 ...
- 【leetcode】Isomorphic Strings
题目简述: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ...
- Log4Net记录日志的使用
Log4net 基本样式: <log4net> <appender name="LogFileAppender" type="log4net.Appen ...
- Swift 圆角设置
故事面板中设置圆角(storyboard) Key Path layer.borderWidth(边框宽度) layer.cornerRadius(圆角弧度) layer.borderColor(边框 ...
- C语言_第五章__实践(密码转换)
1. 要求 输入China 输出 Glmre #include <stdio.h> #include <stdlib.h> int main() { char c ; c ...
- 使用配置文件定义ADO.NET 的连接字符串
最近一直在学习ADO.NET的相关知识,发现要对数据库操作的地方都要先创建一个连接字符串: string constr ="Data Source=(local);Initial Catal ...
- linux 字符设备驱动写法
字符设备,块设备书 一.register_chrdev_region, register_chrdev, misc_register misc device(杂项设备) 在 Linux 内核的incl ...
- Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析
Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计 ...
- S3C2440UART之FIFO
一.基础知识 S3C2440有3个独立的串口,每一个都可以利用DMA和中断方式操作.每个包含2个64字节FIFO,一个收,一个发.非FIFO模式相当于FIFO模式的一个寄存器缓冲模式.每一个UART有 ...
- Torch7学习笔记(四)StochasticGradient
使用随机梯度下降训练神经网络 StochasticGradient是一个比较高层次的类,它接受两个参数,module和criterion,前者是模型结构,后者是损失函数的类型.这个类本身有一些参数: ...