本文版权归博客园和作者本人吴双共同所有,转载请注明本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. Redis百亿级Key存储方案(转)

    1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...

  2. WCF基础

    初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...

  3. 利用poi导出Excel

    import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...

  4. ESLint的使用笔记

    原文地址:https://csspod.com/getting-started-with-eslint/?utm_source=tuicool&utm_medium=referral 在团队协 ...

  5. 原生JavaScript实现hasClass、addClass、removeClass、toggleClass

    兼容IE6+,因IE6.IE7.IE8不支持Array.prototype.indexOf()和String.prototype.trim(),分别用Polyfill实现支持. 详细: indexOf ...

  6. #26 fibonacci seqs

    Difficulty: Easy Topic: Fibonacci seqs Write a function which returns the first X fibonacci numbers. ...

  7. mono for android学习过程系列教程(2)

    接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...

  8. 使用ENode框架前您需要了解的东西(初稿)

    选择ENode意味着什么可能很多人还不太清楚.我简单整理了一下: 意味着你选择了:你需要做DDD领域建模.选择了事件驱动的架构.选择了CQRS架构.选择了最终一致性.选择了事件溯源.选择了分布式.这些 ...

  9. 赠书:HTML5 Canvas 2d 编程必读的两本经典

    赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...

  10. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍

    摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...