本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址。http://www.cnblogs.com/tdws/tag/NoSql/

Redis Pub/Sub模式 基本介绍

Redis发布订阅—Pub/Sub模式或者说是观察者模式。我想大家即使没有使用过,也已经耳熟能详了。

先简单举例说明下应用场景,在场景中我们可以分析到其优势在哪。

比如你的线上应用应用,你想设置一个日志报警系统,当应用出现异常的时候,立马发送通知给你,可能是短信的形式,也可能是邮件的形式。当然如果只将报警通知给你一个人,实现起来很简单,在报警系统中将你的手机号和短信写死在程序中。但是如果你的项目庞大,每个模块有各自的负责人,并且负责人也经常会变更,那么咱们就不能总修改代码了吧?

或者说你的个人博客可以让读者订阅,读者这么多,咱们根本控制不过来呀。

现在发布订阅模式,就可以解决你的问题。在某一点发生改变的时候,其他客户端立即得到通知。也可以说订阅服务器得到应用发布消息,由服务器立即通知给你手中的客户端。这样的好处就是一种松耦合的模式,你不再需要修改发布端和订阅端的任何代码,你只要提供好发布和订阅的操作接口,今后调用就可以了。

首先看一下Redis在控制台中的发布订阅操作。

我开启两个redis命令客户端对相同的一个redis服务进行操作。

首先我们在第一个客户端我们对message01进行订阅,channel名称是我们自定义的,订阅哪个就是哪个。

其次,我们在第二个客户端对message01这个channel进行发布消息。返回值表示有几个客户端订阅。

发布消息后,订阅的客户端立即受收到消息。

StackExchange.Redis操作发布订阅

毕竟我们不可能只将其用在Redis命令控制台哈,最后来看一下在.NET中的使用。我们依然借助StackExchange.

基础配置,本系列第一篇分享已经包含。还记得静态构造函数中,下面这段代码吗?

 _redis.PreserveAsyncOrder = RedisClientConfigurations.PreserveAsyncOrder;//并行

配置中,定义了使用并行的方式来执行命令,大大提高了效率(在你无所谓消息传递的顺序时,可以这样使用)。

在接口中定义如下方法:

  #region Redis发布订阅
/// <summary>
/// Redis发布订阅 订阅
/// </summary>
/// <param name="subChannel"></param>
void RedisSub(string subChannel);
/// <summary>
/// Redis发布订阅 发布
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="channel"></param>
/// <param name="msg"></param>
/// <returns></returns>
long RedisPub<T>(string channel, T msg);
/// <summary>
/// Redis发布订阅 取消订阅
/// </summary>
/// <param name="channel"></param>
void Unsubscribe(string channel);
/// <summary>
/// Redis发布订阅 取消全部订阅
/// </summary>
void UnsubscribeAll(); #endregion

实现如下:

  #region Redis发布订阅
/// <summary>
/// Redis发布订阅 订阅
/// </summary>
/// <param name="subChannel"></param>
public void RedisSub(string subChannel)
{
sub.Subscribe(subChannel, (channel, message) =>
{
Console.WriteLine((string)message);
});
}
/// <summary>
/// Redis发布订阅 发布
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="channel"></param>
/// <param name="msg"></param>
/// <returns></returns>
public long RedisPub<T>(string channel, T msg)
{ return sub.Publish(channel, SerializeContent(msg));
}
/// <summary>
/// Redis发布订阅 取消订阅
/// </summary>
/// <param name="channel"></param>
public void Unsubscribe(string channel)
{
sub.Unsubscribe(channel);
}
/// <summary>
/// Redis发布订阅 取消全部订阅
/// </summary>
public void UnsubscribeAll()
{
sub.UnsubscribeAll();
}
#endregion

客户端测试,我将建立一个ConsoleApp和一个Winform程序,并在其中定义两个按钮。代码如下:

在ConsoleApp中我们作为订阅

      static void Main(string[] args)
{
IRedisClient client = new RedisClient(); client.RedisSub("myFirstChannel");
client.RedisSub("mySecondChannel");
}

在Winform程序中进行发布

  IRedisClient client = new RedisClient();
private void button1_Click(object sender, EventArgs e)
{
client.RedisPub("myFirstChannel", "first");
} private void button2_Click(object sender, EventArgs e)
{
client.RedisPub("mySecondChannel", "second");
}

将两个应用运行起来,操作以及结果如下:

下面操作两个按钮,得到结果。

订阅成功。

如果我的点滴分享,对您能有一点帮助,欢迎点赞支持,也欢迎大牛们持续关注和给予指导建议。

RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用的更多相关文章

  1. Linux(6)- redis发布订阅/持久化/主从复制/redis-sentinel/redis-cluster、nginx入门

    一.redis发布订阅 Redis 通过 PUBLISH .SUBSCRIBE 等命令实现了订阅与发布模式. 其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个 ...

  2. MariaDB主从复制,redis发布订阅,持久化,以及主从同步

      一. MariaDB主从复制 mysql基本操作 1 连接数据库 mysql -u root -p -h 127.0.0.1 mysql -u root -p -h 192.168.12.60 2 ...

  3. redis发布订阅、事务、脚本

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

  4. Redis发布订阅机制

    1. 什么是Redis Redis是一个开源的内存数据库,它以键值对的形式存储数据.由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也 ...

  5. Redis 发布订阅,小功能大用处,真没那么废材!

    今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...

  6. asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

    一.概述 在asp.net core 中可以用WebSocket 或asp.net core SignalR来开发即时通迅.在项目中由于开发前后端分离,对于SignalR前端技术人员不想依赖juqer ...

  7. python中使用redis发布订阅者模型

    redis发布订阅者模型: Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel.发布者和订阅者都是Redis客户端,Channel则 ...

  8. redis发布/订阅

    发布订阅简介 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,消息之间通过channel传递. 准备工作 两台安装了redis的机器(虚拟 ...

  9. 利用Redis发布订阅完成tomcat集群下的消息通知

    以下为个人想法,如果有说的不对的地方请各位大佬见谅! 这是博主的第一篇博客,可能排版以及一些描述有不合理的地方还请勿喷,希望大家尽可能的多给我这样的新人一些鼓励让我能在写博客的道路上走下去. 进入正题 ...

随机推荐

  1. 玩转spring boot——AOP与表单验证

    AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...

  2. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  3. 彻底搞懂Javascript的“==”

    本文转载自:@manxisuo的<通过一张简单的图,让你彻底地.永久地搞懂JS的==运算>. 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容让人犯错,从而 ...

  4. HP服务器 hp 360g5 centos7安装问题

    HP服务器  hp 360g5 centos7安装问题 一 :启动盘无法识别硬盘 1.进入安装光盘,用上下键选择安装centos--Install Centos7(注意不可按Enter键),如图: 2 ...

  5. 12个小技巧,让你高效使用Eclipse

    集成开发环境(IDE)让应用开发更加容易.它们强调语法,让你知道是否你存在编译错误,在众多的其他事情中允许你单步调试代码.像所有的IDE一 样,Eclipse也有快捷键和小工具,这些会让您感觉轻松许多 ...

  6. 初尝Brnshop移植到Linux Mono Jexus环境运行

    brnshop是最近社区上比较火的开源商城. Jexus是Linux上的web服务器,简单说就是Linux的iis吧.特别感谢作者宇内流云的指点 一.根据http://www.cnblogs.com/ ...

  7. CentOS7下自定义目录安装mono+jexus教程

    一.阅读前须知: 1.本文属于安装完Centos7之后的步骤 2.如果还不了解mono,请点击mono 3.本篇主要内容是使用自定义目录安装mono+jexus教程,使用默认目录请查看使用默认目录安装 ...

  8. linux用户权限相关内容查看

    linux用户权限相关内容查看 1   用户信息 创建用户一个名为 webuser 的账号,并填写相应的信息: root@iZ94fabhqhuZ:~# adduser webuser Adding ...

  9. 微信小程序开发初探

    一.关于微信小程序 1.1 小程序诞生的背景 张小龙说道: (1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西. (2)让创造发挥价值→所 ...

  10. 最牛的打字效果JS插件 typing.js

    最新在做公司的一个项目,需要实现一个敲打代码的动画效果,粗意味比较简单,果断自己直接开写,写着写着发现是一个坑.需要支持语法高亮,并不能直接简单的用setTimeout来动态附件innerHTML.苦 ...