C# Redis系列(三)-Redis发布订阅及客户端编程

  1. 发布订阅模型
  2. Redis中的发布订阅
  3. 客户端编程示例
  4. 0.3版本Hredis

发布订阅模型

在应用级其作用是为了减少依赖关系,通常也叫观察者模式。主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方。

发送方:只负责向第三方发送消息。(杂志社把读者杂志交给邮局)
接收方:被动接收消息。(1:向邮局订阅读者杂志,2:门口去接邮过来的杂志)
第三方作用是:存储订阅杂志的接收方,并在杂志过来时送给接收方。 (邮局)

C#示例,发送方把杂志放到邮局里面:

    if (QA.AddBug())
            EmailNotify();
接收方到邮局登记地址,有杂志过来时送货上门:
    EmailNotify += () => { Console.WriteLine("A君"); };
    EmailNotify += () => { Console.WriteLine("B君"); };

第三方邮局接受读者杂志订阅,收到杂志时进行派送:

    public delegate void MessageHandler();
    public static event MessageHandler  EmailNotify;

        if (QA.AddBug())
            EmailNotify();

当我们把观察者模式放大到系统级时,就是发布订阅(pub/sub)了。 主要是用来降低发布者和订阅者的耦合,提高前端系统吞吐量。结构如图:

Redis中的发布订阅

Redis实现完整的发布订阅范式,就是说任何一台redis服务器,启动后都可以当做发布订阅服务器。

普通订阅

启动订阅者client。

redis-cli.exe -h 127.0.0.1 -p 6379

订阅bar频道。格式:SUBSCRIBE name1 name2。
成功订阅回复,分别对应订阅类型、订阅频道、订阅数量。

127.0.0.1:6379> SUBSCRIBE bar
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "bar"
3) (integer) 1

新起个发布者client,发送消息。格式:publish channelName Message。

127.0.0.1:6379> publish bar val
(integer) 1

订阅client回复,分别对应消息类型,频道,消息。

1) "message"
2) "bar"
3) "val"

图例

模式订阅

Redis支持模式匹配订阅,*为模糊匹配符。
订阅所有频道的消息

PSUBSCRIBE *  

订阅以news.开头的所有频道。

PSUBSCRIBE news.*

取消订阅

取消普通订阅和取消模式订阅的命令。

UNSUBSCRIBE  bar
PUNSUBSCRIBE  ba*

取消在官方提供的连接工具中无法模拟的。

查看订阅信息

查看订阅消息是redis在2.8中心增加的命令之一。

pubsub channels [pattern] 。

返回当前服务器被订阅的所有频道。

127.0.0.1:6379> pubsub channels
1) "bar"

指定匹配参数,返回与模式匹配的所有频道。

127.0.0.1:6379> pubsub channels ba*
1) "bar"

pubsub numsub [channel-1 channel-2 ...channel-n]

接受任意多个频道作为输入参数,返回这些频道的订阅者数量。

127.0.0.1:6379> pubsub numsub  bar bar2
1) "bar"
2) (integer) 1
3) "bar2"
4) (integer) 0

客户端编程示例

            RedisPubSub client = new RedisPubSub("127.0.0.1", 6381);
            client.OnUnSubscribe += (obj) => {
                Console.WriteLine();
            };
            client.OnMessage = (sender, arcgs) =>{
                Console.WriteLine(arcgs);
            };
            client.OnError = (Exception) => {
                Console.WriteLine(Exception.Message);
            };
            client.Subscribe("bar");

            Console.ReadLine();

0.3版本HRedis

基本使用

    using (RedisClient client = new RedisClient("127.0.0.1", 6381))
        {
            client.Set("key", "value");
            client.Get("key");
        }

使用连接池,自动回收连接。

        PoolRedisClient prc = new PoolRedisClient(new PoolConfiguration());

        prc.Single.Set("key", "value");

        prc.Single.Get("key");

及上面的订阅。

开源地址 https://github.com/mushroomsir/HRedis

时间: 2024-12-22 14:23:09

C# Redis系列(三)-Redis发布订阅及客户端编程的相关文章

ActiveMQ入门系列三:发布/订阅模式

在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式. 一.理论基础 发布/订阅模式的工作示意图: 消息生产者将消息(发布)到topic中,可以同时有多个消息消费者(订阅)消费该消息. 和点对点方式不同,发布到topic的消息会被所有订阅者消费. 当生产者发布消息,不管是否有消费者,都不会保存消息. 一定要先

rabbitmq系列三 之发布/订阅

1.发布/订阅 在上篇教程中,我们搭建了一个工作队列,每个任务只分发给一个工作者(worker).在本篇教程中,我们要做的跟之前完全不一样 -- 分发一个消息给多个消费者(consumers).这种模式被称为"发布/订阅". 为了描述这种模式,我们将会构建一个简单的日志系统.它包括两个程序--第一个程序负责发送日志消息,第二个程序负责获取消息并输出内容. 在我们的这个日志系统中,所有正在运行的接收方程序都会接受消息.我们用其中一个接收者(receiver)把日志写入硬盘中,另外一个接受

Redis系列三 Redis数据类型

一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类型是二进制安全的.意思是redis的String可以包含任何数据.比如jpg的图片或者序列化的对象. string类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M. 2.Hash(哈希,类似java里的Map) Redis Hash是一个键值对集合. Redis

Redis系列一 Redis安装

Redis系列一    Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt [email protected]:/opt# wget http://download.redis.io/releases/redis-3.2.9.tar.gz [email protected]:/opt# tar -zxvf redis-3.2.9.tar.gz [email protected]:/opt/re

10.【Redis系列】Redis的高级应用-GeoHash

原文:10.[Redis系列]Redis的高级应用-GeoHash Redis在3.2版本增加了GEO模板,意味着通过redis可以做附近的人,附近的门店,附近的商场这样的功能. 用数据库来算附近的人 地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负.比如掘金办公室在望京 SOHO,它的经纬度坐标是 (116.48105,39.996794),都是正数

7.【Redis系列】Redis的高级应用-布隆过滤器

原文:7.[Redis系列]Redis的高级应用-布隆过滤器 拿今日头条来说,它会不停的给我们推荐新的新闻,每次推荐都要去重,过滤掉我们之前看过的内容,今日头条如何做到去重呢,我们上面的HyperLogLog虽然能去重,但是没有办法确认这个新闻有没有被浏览 过,没有pfcontains的方法.有没有更好的解决方案呢? Redis为我们准备了布隆过滤器,是专门用来解决这种去重问题的,它在起去重功能的同时,空间上还可以节约90%,只是稍微有一定的误判率. 什么是布隆过滤器 布隆过滤器可以理解为稍微不

9.【Redis系列】Redis的高级应用-漏斗限流

原文:9.[Redis系列]Redis的高级应用-漏斗限流 漏斗限流是最常用的限流方法之一,顾名思义,这个算法的灵感源于漏斗(funnel)的结构. image.png 漏斗的容量是有限的,如果将漏嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去.如果将漏嘴放开,水就会往下流,流走一部分之后,就又可以继续往里面灌水.如果漏嘴流水的速率大于灌水的速率,那么漏斗永远都装不满.如果漏嘴流水速率小于灌水的速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾空. 所以,漏斗的剩余空间就代表着当前行为

6.【Redis系列】Redis的高级应用-HyperLogLog

原文:6.[Redis系列]Redis的高级应用-HyperLogLog 老规矩还是先假设一个场景:比如京东的商品详情页,如果需要你来统计每天的UV数据,你会如何实现? 如果是PV就好办了,直接给每个网页增加一个计时器,每个网页增加一个日期,这样一进来incrby一次,最终可以计算出每天的统计所有的PV数据. 但是UV就不一样了,每一个用户进来多次每天也只能算一个UV.无论是登录用户还是未登录用户,都需要给一个唯一的ID来标识. 有可能你已经想到了通过set集合去重的功能,为每一个页面创建一个s

redis系列之redis是什么

一.简介 REmote DIctionary Server(Redis),redis是一个基于内存的单机key/value系统,类似memcached,但支持value为多种形式,包括:字符串(string).链表(list).集合(set).有序集合(sorted set)和hash table 二.特点 1 优点 与memcache和MySQL等类似产品比较,Redis有以下几个优点: (1) 非常丰富的数据结构,且这些数据结构的常见操作均是原子性的: (2) 高速读写.Memcached提