StackExchange.Redis学习笔记(五) 发布和订阅
Redis命令中的Pub/Sub
Redis在 2.0之后的版本中 实现了 事件推送的 发布订阅命令
以下是Redis关于发布和订阅提供的相关命令
SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道的信息。
PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道。
PUBLISH channel message
将信息 message 发送到指定的频道 channel 。
PUBSUB <subcommand> [argument [argument ...]]
查看所有活跃的频道
PUNSUBSCRIBE [pattern [pattern ...]]
客户端退订所有订阅的给定模式的频道
UNSUBSCRIBE [channel [channel ...]]
指示客户端退订给定的频道。
这里的频道可以分为两类,一种是指定名称的频道,还有一种是模糊匹配的频道(模式),两种类型的频道 订阅和退订所需要的命令是不同的
下面分别演示下这些命令的基本用法


上图中左边客户端订阅了msg频道的消息 。 另一个客户端对msg频道发布消息,订阅的客户端成功接收到消息。
我们用pubsub命令来查询所有的活跃频道。当前有一个活跃频道msg


这里左边的客户端订阅了符合给定模式news.*的模式频道,另一个客户端向news.it 来发送消息,成功接收。
调用pusub查看活跃频道时为空,因为模式频道的订阅不算在活跃频道内
在dos命令下订阅后界面就卡住等待消息了,所以没办法来演示取消订阅的命令。就不贴图了
StackExchange.Redis中的发布和订阅
使用StackExchange.Redis发布和订阅首先需要通过connection获取一个Subscriber,该类实现了ISubscriber 接口,接口中定义了相应的Subscribe,Publish等相关函数。
用法比较简单,直接上代码了
public class RedisSubPub
{
public void SubScribe(string cnl)
{
Console.WriteLine("主线程:" + Thread.CurrentThread.ManagedThreadId);
var sub = StackExchangeRedisHelper.Instance.GetSubscriber();
sub.Subscribe(cnl, SubHandel);
Console.WriteLine("订阅了一个频道:"+ cnl);
}
public void SubHandel(RedisChannel cnl, RedisValue val)
{
Console.WriteLine();
Console.WriteLine("频道:" + cnl + "\t收到消息:" + val); ;
Console.WriteLine("线程:" + Thread.CurrentThread.ManagedThreadId + ",是否线程池:" + Thread.CurrentThread.IsThreadPoolThread);
if (val == "close")
StackExchangeRedisHelper.Instance.GetSubscriber().Unsubscribe(cnl);
if (val == "closeall")
StackExchangeRedisHelper.Instance.GetSubscriber().UnsubscribeAll();
}
}
static void Main(string[] args)
{
RedisSubPub r = new RedisSubPub();
r.SubScribe("it");
r.SubScribe("news");
r.SubScribe("sport");
r.SubScribe("others*");
Console.Read();
}
我用程序中的代码作为订阅者,订阅了四个频道,然后在Dos命令行窗口中向响应的频道来发送消息


程序运行之后StackExchange.Redis默认订阅了一个__Booksleeve_MasterChanged 频道,这个订阅主要是在Redis集群的主从配置发生改变时会触发,我们忽略掉它
在客户端我订阅了三个频道,以及一个others*模式频道。通过pubsub命令查询到了3个频道
订阅者调用Unsubscribe来取消订阅特定的频道,通过UnsubscribeAll取消订阅所有的频道
Redis是没有提供取消订阅所有频道的命令的,StackExchange.Redis通过把每一个订阅的频道都加到一个字典中,然后取消的时候会从字典中来查询要取消的频道名称。
StackExchange.Redis源代码片段如下


这段代码也可以看出来保持订阅频道正确工作的前提是保持一个静态的连接实例!
StackExchange.Redis学习笔记(五) 发布和订阅的更多相关文章
- StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...
- StackExchange.Redis学习笔记(三)
这一章主要写一些StackExchange.Redis的配置及不太经常用到的函数 数据库连接 下面是我的连接字符串,里面指定了地址,密码,及默认的数据库 Redis启动后默认会分成0-15个数据库,不 ...
- StackExchange.Redis学习笔记(三) 数据库及密码配置 GetServer函数
这一章主要写一些StackExchange.Redis的配置及不太经常用到的函数 数据库连接 下面是我的连接字符串,里面指定了地址,密码,及默认的数据库 Redis启动后默认会分成0-15个数据库,不 ...
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- StackExchange.Redis学习笔记(一) Redis的使用初探
Redis Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化. 与其它键值数据存储相比,Redis有一组相对丰富的数据类型. Redis可以将数据复制到任意数量的从机中 Redis的安装 官 ...
- Redis学习笔记8--Redis发布/订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者 ...
- Redis学习笔记(8)-发布/订阅
package cn.com; import java.util.List; import redis.clients.jedis.Jedis; public class Redis_PubSub { ...
- Redis学习笔记--五种数据类型的使用场景
String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- Redis学习笔记五:独立功能之事务
Redis 事务提供了一种将多个命令请求打包,然后一次性.按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断,会将事务中的所以命令都执行完毕才去处理其他客户端的命令请求. 事务的实现 事务 ...
随机推荐
- Android项目实战(三十六):给背景加上阴影效果
圆角背景大家应该经常用: 一个drawable资源文件 里面控制corner圆角 和solid填充色 <shape xmlns:android="http://schemas.and ...
- Ubuntu系统怎么切换多用户命令界面
ctrl+alt+F2~F6 切换窗口 返回桌面 Ctrl+Alt+F7
- iOS屏幕适配(尺寸适配)
屏幕尺寸适配:一 在.pch中加入以下代码,在定义每个尺寸值的时候都调用下边的宏 //以iphone7为例 定义 view相关的宽高宏#define IPHONEHIGHT(b) [UIScreen ...
- MongoDB入门系列(二):Insert、Update、Delete、Drop
概述 本章节介绍Insert.Update.Delete.Drop操作基本语法. 环境: Version:3.4 insert insert()基本语法如下: db.collection.insert ...
- JAVA 实现tail -f 日志文件监控功能
工具: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</ar ...
- tar --打包和压缩
tar 参考链接 作用:为linux的文件和目录创建档案,也可以在档案中改变文件,或者向档案中加入新的文件即用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的 语法:tar[必要参 ...
- vue 和 react 学习 异同点
vue 和 react 学习 异同点 本文不做两个框架比较,只对比了两个框架的语法对比,不代表任何观点,盗版必究,本人唯一qq:421217189 欢迎大家一起来学习探讨,壮我大前端(本文markdo ...
- Python第二十四天 binascii模块
Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...
- 更好的小票打印体验,huanent.printer2.0发布
huanent.printer2.0是一个专注消费小票打印的类库.拥有许多先进的特性例如居中打印.自动换行等特性,可以通过简洁的代码来打印出复杂的消费小票.huanent.printer通过MIT方式 ...
- 二维码utils希望对大家有帮助
package cn.itcast.utils; import java.io.File; import java.nio.file.Path; import java.util.HashMap; ...