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. BeautifulSoup 抓取网站url

    1 # -*- coding:utf-8 -*- 2 import urlparse 3 import urllib2 4 from bs4 import BeautifulSoup 5 6 url ...

  2. Mesos初步尝试

    记得几年前,用.net做分布式批处理的时候环境搭建很麻烦,虽然参数的分片算法.配置都搞定了,但是.net虚拟机的环境建立是个头疼的事: 节点要自己手工建 环境变量没法从前往后传递 批处理程序改动后的分 ...

  3. python decorator 进阶

    上一篇文章开始的时候提到 “一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者参数)” 有一般情况,就有特殊情况.第一种特殊情况:装饰器可能也是一个类:第二种特殊 ...

  4. mysql主从备份+keepalived自动切换

    数据库这一层需要做到避免单点故障可以是主从备份和主主备份,主主备份可能有性能损耗和数据同步的问题.这里记录下主从备份, mysql进行备份之前确保mysql的版本是一样的,我这里用的都是mysql5. ...

  5. 环链表相关的题目和算法[LeetCode]

    这篇文章讨论一下与链表的环相关的题目,我目前遇到的一共有3种题目. 1.判断一个链表是否有环(LeetCode相关题目:https://leetcode.com/problems/linked-lis ...

  6. KVO等具体实现步骤以及注意事项

    KVO是一种设计模式,名为观察者. addObserver:forKeyPath:options:context: 通知其他对象的方法,这个方法在NSObject中就已经申明了,也就是说任何继承自NS ...

  7. SQL Server AlwaysOn添加监听器失败

    标签:MSSQL/ 一.错误描述 1.群集服务未能使群集服务或应用程序“Alwayson22”完全联机或脱机.一个或多个资源可能处于失败状态.这可能会影响群集服务或应用程序的可用性 2.群集服务中的群 ...

  8. UVALive 4490 Help Bubu

    题目大意:有n本书,高度值域为8,现可以把k本书拿出来再放进去,相邻的.高度相同的书算作一块,最小化块的个数.n=100. 强烈建议大家不要在做完区间DP后做别的DP题:区间DP是整体考虑,而一般DP ...

  9. Java集合(一) CopyOnWriteArrayList

    CopyOnWriteArrayList 类分析   1. CopyOnWriteArrayList 其中底层实现存放数据是一个Object数组:   private volatile transie ...

  10. ioutil包二

    ioutil包二 (原创随笔,转载请注明出处 http://www.cnblogs.com/majianguo/p/8016426.html) ioutil包实现了一些I/O实用功能,导出了7个函数和 ...