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学习笔记(五) 发布和订阅的更多相关文章

  1. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...

  2. StackExchange.Redis学习笔记(三)

    这一章主要写一些StackExchange.Redis的配置及不太经常用到的函数 数据库连接 下面是我的连接字符串,里面指定了地址,密码,及默认的数据库 Redis启动后默认会分成0-15个数据库,不 ...

  3. StackExchange.Redis学习笔记(三) 数据库及密码配置 GetServer函数

    这一章主要写一些StackExchange.Redis的配置及不太经常用到的函数 数据库连接 下面是我的连接字符串,里面指定了地址,密码,及默认的数据库 Redis启动后默认会分成0-15个数据库,不 ...

  4. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  5. StackExchange.Redis学习笔记(一) Redis的使用初探

    Redis Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化. 与其它键值数据存储相比,Redis有一组相对丰富的数据类型. Redis可以将数据复制到任意数量的从机中 Redis的安装 官 ...

  6. Redis学习笔记8--Redis发布/订阅

    发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者 ...

  7. Redis学习笔记(8)-发布/订阅

    package cn.com; import java.util.List; import redis.clients.jedis.Jedis; public class Redis_PubSub { ...

  8. Redis学习笔记--五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  9. Redis学习笔记五:独立功能之事务

    Redis 事务提供了一种将多个命令请求打包,然后一次性.按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断,会将事务中的所以命令都执行完毕才去处理其他客户端的命令请求. 事务的实现 事务 ...

随机推荐

  1. 分布式:2PC,3PC,Paxos,Raft,ISR [转]

    本文主要讲述2PC及3PC,以及Paxos以及Raft协议. 两类一致性(操作原子性与副本一致性) 2PC协议用于保证属于多个数据分片上的操作的原子性.这些数据分片可能分布在不同的服务器上,2PC协议 ...

  2. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  3. 将java项目打包成docker镜像

    简介:将jar打包成镜像好说,毕竟jar包长的都是一样的,但是我们只是写了一个普通的java项目,我也不方便封装成jar包什么的,但是我们也想打包docker image怎么办呢,我们可以用编译后的j ...

  4. 一些常用的vim编辑器快捷键:

    一些常用的vim编辑器快捷键: h」.「j」.「k」.「l」,分别控制光标左.下.上.右移一格. 按「ctrl」+「b」:屏幕往“后”移动一页. 按「ctrl」+「f」:屏幕往“前”移动一页. 按「c ...

  5. python方法的延迟加载

    数据挖掘的过程中,数据进行处理是一重要的环节,我们往往会将其封装成一个方法,而有的时候这一个方法可能会被反复调用,每一次都对数据进行处理这将是一个很耗时耗资源的操纵,那么有没有办法将计算后的结果缓存起 ...

  6. 转:Siri之父:语音交互或将主导未来十年发展

    http://zhinengjiaohu.juhangye.com/201709/weixin_5664458.html Siri之父Adam Cheyer认为,语音交互很可能是未来十年内计算技术的一 ...

  7. bzoj 4310: 跳蚤

    Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典 ...

  8. Windows as a Service(1)—— Windows 10服务分支

    前言 作为公司的IT管理员,管理全公司Windows 10操作系统的更新一直是工作中的头疼之处.微软提供了很多方法来帮助我们管理公司的Windows 10更新,比如Windows Server Upd ...

  9. .net中如何实现多线程

    l线程肯定也是要执行一段代码的.所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码.(找个人来做一件事情) l线程启动时,通过委托调用该方法. (委托的好处) ...

  10. jQuery 文档操作方法

    jQuery 文档操作方法 这些方法对于 XML 文档和 HTML 文档均是适用的,除了:html(). 方法 描述 addClass() 向匹配的元素添加指定的类名. after() 在匹配的元素之 ...