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

常用命令

命令

描述

复杂度

返回

PSUBSCRIBE pattern [pattern ...]

订阅一个或多个符合给定模式的频道。每个模式以*作为匹配符,比如it*匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)

O(N),N是订阅的模式的数量。

接收到的信息

PUBLISH channel message

将信息message发送到指定的频道 channel 。

O(N+M),其中N 是channel的订阅者数量,而M 则是使用模式订阅的客户端的数量。

接收到信息 message 的订阅者数量。

PUBSUB CHANNELS [pattern]

列出当前的活跃频道。活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的客户端不计算在内。pattern 参数是可选的:如果不给出pattern 参数,那么列出订阅与发布系统中的所有活跃频道。如果给出 pattern 参数,那么只列出和给定模式pattern相匹配的那些活跃频道。

O(N) ,N为活跃频道的数量

PUBSUB NUMSUB [channel-1 ... channel-N]

返回给定频道的订阅者数量, 订阅模式的客户端不计算在内。返回一个多条批量回复(,回复中包含给定的频道,以及频道的订阅者数量。 格式为:频道 channel-1 , channel-1 的订阅者数量,频道 channel-2 , channel-2 的订阅者数量,诸如此类。

O(N) , N为给定频道的数量。

PUBSUB NUMPAT

返回订阅模式的数量。注意, 这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和。

O(1)

PUNSUBSCRIBE [pattern [pattern ...]]

指示客户端退订所有给定模式。如果没有模式被指定,也即是,一个无参数的PUNSUBSCRIB调用被执行,那么客户端使用PSUBSCRIBE命令订阅的所有模式都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的模式。

O(N+M), N是客户端已订阅的模式的数量,M则是系统中所有客户端订阅的模式的数量。

SUBSCRIBE channel [channel ...]

订阅给定的一个或多个频道的信息。

O(N),N是订阅的频道的数量。

UNSUBSCRIBE [channel [channel ...]]

指示客户端退订给定的频道。如果没有频道被指定,也即是,一个无参数的 UNSUBSCRIBE 调用被执行,那么客户端使用 SUBSCRIBE 命令订阅的所有频道都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的频道。

O(N),N是客户端已订阅的频道的数量。

PUB/SUB

  SUBSCRIBE 、UNSUBSCRIBE和PUBLISH三个命令实现了发布与订阅信息泛型, 在这个实现中,发送者不是将信息直接发送给特定的接收者, 而是将信息发送给channel, 然后由频道将信息转发给所有对这个频道感兴趣的订阅者。发送者无须知道任何关于订阅者的信息, 而订阅者也无须知道是那个客户端给它发送信息, 它只要关注自己感兴趣的频道即可。对发布者和订阅者进行解耦, 可以极大地提高系统的扩展性, 并得到一个更动态的网络拓扑。比如说, 要订阅频道foo和bar, 客户端可以使用频道名字作为参数来调用 SUBSCRIBE 命令:

redis> SUBSCRIBE foo bar  

  当有客户端发送信息到这些频道时, Redis会将传入的信息推送到所有订阅这些频道的客户端里面。正在订阅频道的客户端不应该发送除SUBSCRIBE和UNSUBSCRIBE之外的其他命令。其中,SUBSCRIBE可以用于订阅更多频道, 而UNSUBSCRIBE则可以用于退订已订阅的一个或多个频道。SUBSCRIBE和UNSUBSCRIBE的执行结果会以信息的形式返回, 客户端可以通过分析所接收信息的第一个元素, 从而判断所收到的内容是一条真正的信息, 还是SUBSCRIBE或UNSUBSCRIBE命令的操作结果。

  Channel转发的每条信息都是一条带有三个元素的多条批量回复(multi-bulk reply)。信息的第一个元素标识了信息的类型:

  • subscribe :表示当前客户端成功地订阅了信息第二个元素所指示的频道。而信息的第三个元素则记录了目前客户端已订阅频道的总数。
  • unsubscribe :表示当前客户端成功地退订了信息第二个元素所指示的频道。信息的第三个元素记录了客户端目前仍在订阅的频道数量。当客户端订阅的频道数量降为0时,客户端不再订阅任何频道,它可以像往常一样, 执行任何Redis命令。
  • message :表示这条信息是由某个客户端执行PUBLISH命令所发送的,真正的信息。信息的第二个元素是信息来源的频道,而第三个元素则是信息的内容。

  举个例子, 如果客户端执行以下命令:

redis> SUBSCRIBE first second
那么它将收到以下回复: 1) "subscribe"
2) "first"
3) (integer) 1 1) "subscribe"
2) "second"
3) (integer) 2 

  如果在这时, 另一个客户端执行以下 PUBLISH 命令:

redis> PUBLISH second Hello

  那么之前订阅了 second 频道的客户端将收到以下信息:

1) "message"
2) "second"
3) "hello"

  当订阅者决定退订所有频道时,它可以执行一个无参数的UNSUBSCRIBE命令:

redis> UNSUBSCRIBE

  这个命令将接到以下回复:

1) "unsubscribe"
2) "second"
3) (integer) 1 1) "unsubscribe"
2) "first"
3) (integer) 0 

  Redis的发布与订阅实现支持模式匹配(pattern matching):客户端可以订阅一个带 * 号的模式, 如果某个/某些频道的名字和这个模式匹配, 那么当有信息发送给这个/这些频道的时候, 客户端也会收到这个/这些频道的信息。比如说,执行命令

redis> PSUBSCRIBE news.*

  的客户端将收到来自 news.art.figurative 、 news.music.jazz 等频道的信息。客户端订阅的模式里面可以包含多个 glob 风格的通配符, 比如 * 、 ? 和 [...] , 等等。执行命令:

redis> PUNSUBSCRIBE news.*

  将退订 news.* 模式, 其他已订阅的模式不会被影响。通过订阅模式接收到的信息,和通过订阅频道接收到的信息, 这两者的格式不太一样:

  • 通过订阅模式而接收到的信息的类型为 pmessage :这代表有某个客户端通过PUBLISH向某个频道发送了信息, 而这个频道刚好匹配了当前客户端所订阅的某个模式。 信息的第二个元素记录了被匹配的模式, 第三个元素记录了被匹配的频道的名字, 最后一个元素则记录了信息的实际内容。

  客户端处理PSUBSCRIBE和PUNSUBSCRIBE返回值的方式,和客户端处理SUBSCRIBE和UNSUBSCRIBE的方式类似:通过对信息的第一个元素进行分析,客户端可以判断接收到的信息是一个真正的信息, 还是PSUBSCRIBE或PUNSUBSCRIBE命令的返回值。

  如果客户端订阅的多个模式匹配了同一个频道, 或者客户端同时订阅了某个频道、以及匹配这个频道的某个模式, 那么它可能会多次接收到同一条信息。举个例子,如果客户端执行了以下命令:

SUBSCRIBE foo
PSUBSCRIBE f*

  那么当有信息发送到频道 foo 时, 客户端将收到两条信息: 一条来自频道 foo ,信息类型为 message ; 另一条来自模式 f* ,信息类型为 pmessage 。

  在执行SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE和PUNSUBSCRIBE命令时, 返回结果的最后一个元素是客户端目前仍在订阅的频道和模式总数。当客户端退订所有频道和模式, 也即是这个总数值下降为0的时候, 客户端将退出订阅与发布状态。

  因为所有接收到的信息都会包含一个信息来源:当信息来自频道时,来源是某个频道;当信息来自模式时,来源是某个模式。因此, 客户端可以用一个哈希表, 将特定来源和处理该来源的回调函数关联起来。 当有新信息到达时, 程序就可以根据信息的来源, 在 O(1) 复杂度内, 将信息交给正确的回调函数来处理。

Redis学习-发布/订阅的更多相关文章

  1. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  2. redis的发布订阅模式

    概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer {     /* Pubsub */     // 字典,键为频道, ...

  3. StackExchange.Redis 使用-发布订阅 (二)

    使用Redis的发布订阅功能 redis另一个常见的用途是发布订阅功能 . 它非常的简单 ,当连接失败时 ConnectionMultiplexer 会自动重新进行订阅 . ISubscriber s ...

  4. .net core 使用Redis的发布订阅

    Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来使用,但是他不仅仅可以用来作为缓存,比如著名的分布式框架dubbo就可以用Redis来做服务注册中心.接下来介绍一下.net core 使用 ...

  5. redis的发布订阅模式pubsub

    前言 redis支持发布订阅模式,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个 ...

  6. java实现 redis的发布订阅(简单易懂)

    redis的应用场景实在太多了,现在介绍一下它的几大特性之一   发布订阅(pub/sub). 特性介绍: 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publ ...

  7. spring boot 使用redis进行发布订阅

    异步消息的方式有很多,这篇博客介绍如何使用redis进行发布订阅, 完成这个示例只需要三个文件 1.redis消息监听配置 @Configuration public class RedisListe ...

  8. 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能

    springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...

  9. redis的发布订阅、持久化存储、redis的主从复制

    redis的发布订阅 1. 创建redis配置文件 vim /opt/redis_conf/reids-6379.conf mkdir /data/6379 redis-server  redis-6 ...

随机推荐

  1. Redis应用----消息传递

    1.摘要 消息传递这一应用广泛存在于各个网站中,这个功能也是一个网站必不可少的.常见的消息传递应用有,新浪微博中的@我呀.给你评论然后的提示呀.赞赞赞提示.私信呀.甚至是发微博分享的新鲜事:知乎中的私 ...

  2. Appium手势密码滑动之Z字形走势(java篇)

    1.直接使用负的偏移量appium会报错,在后面加上moveto(1,1)就行了 2.直接看图说话 废话少说看代码如: List<AndroidElement> element = dri ...

  3. 老李分享:接电话之uiautomator 1

    老李分享:接电话之uiautomator   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9 ...

  4. 手机自动化测试:Appium源码分析之跟踪代码分析九

    手机自动化测试:Appium源码分析之跟踪代码分析九   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  5. ReactJS入门:展示数据

    由于公司开发需要,博主利用闲暇的时间对ReactJS的基础知识进行了一些粗浅的认识和了解.博主对ReactJS的学习主要来自官网(http://reactjs.cn/react/docs/thinki ...

  6. Gym 101257G 24 (概率+二分)

    题意: 有一道分值为sa的题,n个人比赛写这道题,按照递减的顺序给出每个人的当前分数,和每个人写不出这道题的概率,让你输出有反超现象出现的期望 思路:由于之前把题目翻译错了导致很久没有相通,后来看了别 ...

  7. 用Gradle构建Spring Boot项目

    相比起Maven的XML配置方式,Gradle提供了一套简明的DSL用于构建Java项目,使我们就像编写程序一样编写项目构建脚本.本文将从无到有创建一个用Gradle构建的Spring Boot项目, ...

  8. linux cut命令详解

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [f ...

  9. React翻译官网文档之JSX

    什么是JSX? 看下面的代码它被称为JSX,它既不是字符串也不是HTML,而是一种facebook公司对javascript语法的拓展.虽然写法很奇怪最终仍会会被编译为javascript代码 con ...

  10. 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView

    本文主要介绍如下三个Android支持库控件的配合使用: TabLayout:android.support.design.widget.TabLayout ViewPager:android.sup ...