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 事务提供了一种将多个命令请求打包,然后一次性.按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断,会将事务中的所以命令都执行完毕才去处理其他客户端的命令请求. 事务的实现 事务 ...
随机推荐
- CoreJava逻辑思维-顺时针打印自定义矩阵
CoreJava逻辑思维-顺时针打印自定义矩阵 这两天回顾了一下刚入Java时的一些比较有意思的逻辑题,曾经也费劲脑汁的思考过的一些问题,比如百钱百鸡最简单的算法啦之类的,而今天博主想说的是一个循环打 ...
- JavaScript实现段落文本高亮
代码: <!doctype html> <html lang="en"> <head> <meta http-equiv="Co ...
- 【java】Vector
package com.tn.collect; import java.util.Enumeration; import java.util.Iterator; import java.util.Ve ...
- Python学习日记:day1
1.计算机基础 cpu:相当于人的大脑,用于计算. 内存:储存数据,运行速度快,成本高,断电数据消失. 硬盘 :固态硬盘(快).机械硬盘(有指针).储存数据,需要长期保持数据,重要文件 打开qq过程: ...
- MySQL创建用户与授权方法
最近在弄个mysql兼职项目,记录一下: 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username ...
- 【原码笔记】-- protobuf.js 与 Long.js
protobuf.js的结构和webpack的加载之后的结构很相似.这样的模块化组合是个不错的结构方式.1个是适应了不同的加载方式,2个模块直接很独立.webpack的功能更全一点.但如果自己封装js ...
- [置顶]
Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...
- NOI2009 植物大战僵尸
啊一道好题感觉写得挺爽的啊这题这种有一点懵逼然后学了一点东西之后很明朗的感觉真是好!预处理参考 :http://www.cppblog.com/MatoNo1/archive/2014/11/01/1 ...
- Cat 跨线程之 TaggedTransaction 用法和原理分析
代码 package com.dianping.cat.message.internal; import com.dianping.cat.Cat; import com.dianping.cat.m ...
- 随手记一下,VS2015卡顿问题解决。
不知道什么开始,vs2015卡顿的很,启动时加载项目很慢,调试是启动慢,停止调试时直接卡死半分钟.其他都还能忍受,最不能忍受的是点击停止调试按钮后十几秒没反应! 网上有解决方案如下几个,我试了,都不行 ...