1. 发布-订阅概念

发布-订阅 模式包含两种角色,分别为发布者和订阅者。

  • 订阅者可以订阅一个或者若干个频道(channel);
  • 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消息;

2. 发布-订阅命令

发布模式的命令为:

publish channel message

订阅模式的命令为:

subscribe channel [channel...]

取消给定的一个或多个频道的信息。

unsubscribe channel [channel ...]

3. 发布-订阅实例

publish 命令的返回值表示接收到这条消息的订阅者数量,没有客户端订阅该频道时返回 0 。

127.0.0.1:6379> publish channel "hello"
(integer) 0
127.0.0.1:6379>

发出去的消息不会做持久化处理,也就是说当客户端订阅该频道后,只能收到后续发布到该频道的消息,之前发送的就收不到了。

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

进入订阅状态的客户端可能收到 3 种类型的回复,每种类型的回复都包含 3 个值:

  • 1 个是消息的类型,根据消息类型的不同,
  • 第二、三值的含义也不同。

消息类型取值有以下 3 种:

  • subscribe

    表示订阅成功的反馈信息,第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量;

  • message

    表示接收到的消息,第二个值表示产生消息的频道名称,第三个值是消息的内容;

  • unsubscribe

    表示成功取消订阅某个频道,第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量;当此值为 0 时客户端会退出订阅状态,之后就可以执行其它非 “发布-订阅” 模式的命令了;

127.0.0.1:6379> publish channel "hello"
(integer) 0
127.0.0.1:6379> publish channel "How are you"
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> unsubscribe channel      # 取消订阅某个频道
1) "unsubscribe"      # 表示成功取消订阅某个频道
2) "channel"          # 对应的频道名称
3) (integer) 0          # 第三个值是当前客户端订阅的频道数量
127.0.0.1:6379>
127.0.0.1:6379> subscribe channel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"        # 订阅成功的反馈信息
2) "channel"      # 订阅成功的频道名称
3) (integer) 1      # 当前客户端订阅的频道数量1) "message"        # 表示接收到的消息
2) "channel"      # 第二个值表示产生消息的频道名称
3) "How are you"  # 第三个值是消息的内容

4. 多频道发布订阅模式

以上只是单个频道的发布订阅, 如果想订阅多个频道,则需要使用 使用 psubscribe 命令,后面跟着我们要订阅的频道的表达式,* 代表任意值,订阅多个频道:

127.0.0.1:6379> PSUBSCRIBE greets*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "greets*"
3) (integer) 1

发布消息:

root@171669ba8bdb:/data# redis-cli
127.0.0.1:6379> publish greet1 "hello"
(integer) 0
127.0.0.1:6379> publish greets_1 "hello"
(integer) 1
127.0.0.1:6379> publish greets_2 "world"
(integer) 1
127.0.0.1:6379> publish greets_3 "I am redis"
(integer) 1
127.0.0.1:6379>

订阅者收到的消息:

127.0.0.1:6379> psubscribe greets*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "greets*"
3) (integer) 1
1) "pmessage"
2) "greets*"
3) "greets_1"
4) "hello"
1) "pmessage"
2) "greets*"
3) "greets_2"
4) "world"
1) "pmessage"
2) "greets*"
3) "greets_3"
4) "I am redis"

5. 发布订阅模式缺点

PubSub 的生产者传递过来一个消息,Redis 会直接找到相应的消费者传递过去。如果一个消费者都没有,那么消息直接丢弃。如果开始有三个消费者,一个消费者突然挂掉了,生产者会继续发送消息,另外两个消费者可以持续收到消息。但是挂掉的消费者重新连上的时候,这断连期间生产者发送的消息,对于这个消费者来说就是彻底丢失了。

如果 Redis 停机重启,PubSub 的消息是不会持久化的,毕竟 Redis 宕机就相当于一个消费者都没有,所有的消息直接被丢弃。

Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)相关推荐

  1. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  2. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

  3. Redis 高级特性(2)—— 发布 订阅模式

    Redis 高级特性 -- 发布订阅 1. 发布-订阅介绍 "发布-订阅"模式包含两种角色,分别为发布者和订阅者.订阅者可以订阅一个或者若干个频道(channel),而发布者可以向 ...

  4. 发布订阅模式vs观察者模式

    背景 最近在研究react的状态管理器zustand时,研究源码时发现其组件注册绑定是通过观察者模式结合react hooks实现更新的.而联想之前写vue的时候,经常会用到vue内置的自定义事件进行 ...

  5. 【设计模式】692- TypeScript 设计模式之发布-订阅模式

    前言 在之前两篇自测清单中,和大家分享了很多 JavaScript 基础知识,大家可以一起再回顾下~ 本文是我在我们团队内部"「现代 JavaScript 突击队」"分享的一篇内容 ...

  6. 【EventBus】发布-订阅模式 ( Android 中使用 发布-订阅模式 进行通信 )

    文章目录 一.拷贝 发布-订阅模式 相关类 二.完整代码示例 一.拷贝 发布-订阅模式 相关类 将上一篇博客 [EventBus]发布-订阅模式 ( 使用代码实现发布-订阅模式 ) 写的 发布-订阅模 ...

  7. JavaScript 设计模式之观察者模式与发布订阅模式

    前言 在软体工程中,设计模式(design pattern)是对软体设计中普遍存在(反复出现)的各种问题,所提出的解决方案. 设计模式并不直接用来完成程式码的编写,而是描述在各种不同情况下,要怎么解决 ...

  8. Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...

  9. 设计模式之发布订阅模式

    发布--订阅模式简介 发布--订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,多个观察者对象都依赖于一个目标对象,当目标对象的状态发生变化时,所有依赖于这个对象的观察者对象都会收到通知. ...

最新文章

  1. 运动目标跟踪__kalman
  2. 今日 Paper | 社交媒体谣言检测;连续手语识别;细粒度服装相似性学习;混合图神经网络等
  3. JTable动态显示隐藏列
  4. 在当当买了python怎么下载源代码-爬虫实战:爬取当当网所有 Python 书籍
  5. Python的序列化与反序列化
  6. 微软对外开放更多软件技底层代码术文档
  7. 从框架源码中学习结构型设计模式
  8. vscode unins000.exe报错,尝试在目标目录创造文件时发生错误
  9. 内存分配方式及内存碎片
  10. 戴尔服务器连接显示器无信号 键盘灯不亮,键盘灯不亮按键没反应怎么回事及解决办法...
  11. 废弃军舰回收站、废铁回炉重造
  12. TJOI 2015 弦论 题解
  13. 苹果开启了UWB上下游成熟的大门
  14. 简单的学生网页作业源码 基于html css javascript仿淘宝购物商城设计毕业论文源码
  15. matlab删除矩阵一列数据,matlab中实现矩阵删除一行或一列的方法
  16. c#天敏sdk2000的视频采集卡简单调用
  17. php fopen 指定路径,fopen 系统找不到指定路径 PHP文件包含详细讲述
  18. 全面掌控城市运行状态,数梦工场推出数智城市指标系统 | 案例研究
  19. R语言GD包地理探测器分析时报错、得不到结果等情况的解决方案
  20. 年轻人的浮躁,这社会的喧嚣

热门文章

  1. 设置select下拉框不可修改的→“四”←种方法
  2. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
  3. Linux shell 学习笔记(2)— 监测程序、磁盘空间和处理文件(ps -ef、top、kill、df、du 、grep、tar)
  4. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)
  5. CRF(条件随机场)与Viterbi(维特比)算法原理详解
  6. RNN,LSTM,GRU基本原理的个人理解重点
  7. LeetCode中等题之删除链表的中间节点
  8. MVC、MVP和MVVM的优缺点
  9. Ubuntu系统打开终端的方法
  10. andorid 启动模式面试题