6. Redis 发布与订阅

article/2025/9/11 9:22:11

文章目录

    • 6. Redis 发布与订阅
        • 为什么需要发布、订阅
        • 发布/订阅如何使用?
      • :one:基于频道发布
        • SUBSCRIBE:频道订阅
        • PUBLISH:向频道发送消息
        • UNSUBSCRIBE:退订频道
      • :two: 基于模式(pattern)的发布/订阅
        • PSUBSCRIBE:模式订阅
        • PUBLISH:模式发布
        • PUNSUBSCRIBE:退订模式
        • 查看被订阅的频道
        • 查看频道的订阅者数量
        • 查看被订阅模式的总数量
      • :three: 使用注意

6. Redis 发布与订阅

参考地址:https://blog.csdn.net/w15558056319/article/details/121490953

Redis的发布与订阅功能可以让客户端通过广播方式,将 消息(message)同时发送给可能存在的多个客户端,并且发送消息的客户端不需要知道接收消息的客户端的具体信息。换句话说,发布消息的客户端与接收消息的客户端两者之间没有直接联系。

在Redis中,客户端可以通过订阅特定的 频道(channel)来接收发送至该频道的消息,我们把这些订阅频道的客户端称为订阅者(subscriber)。一个频道可以有任意多个订阅者,而一个订阅者也可以同时订阅任意多个频道。除此之外,客户端还可以通过向频道发送消息的方式,将消息发送给频道的所有订阅者,我们把这些发送消息的客户端称为发送者(publisher)。

发布订阅的实现场景

1、实时沟通消息系统

2、微信公众号(点击关注,后台发送一篇博客,订阅的用户就可以监听到)

3、电商中,用户下单成功之后向指定频道发送消息,下游业务订阅支付结果这个频道处理自己相关业务逻辑

4、粉丝关注功能、文章推送

还有一些比较复杂的场景,可以使用消息中间件来做,kafka RabbitMQ ActiveMQ RocketMQ …等

在这里插入图片描述

示例:

有三个客户端订阅了一个 Channel1

在这里插入图片描述

当 Channel1 的后台发送了一个数据到 Channel1 的频道中,这三个订阅了 Channel1 的客户端就会同时收到这个数据
在这里插入图片描述

为什么需要发布、订阅

redisList 数据类型结构提供了 blpop 、brpop 命令结合 rpush、lpush 命令可以实现消息队列机制,基于双端链表实现的发布与订阅功能

  • 这种方式存在两个局限性:
  1. 不能支持一对多的消息分发。
  2. 如果生产者生成的速度远远大于消费者消费的速度,易堆积大量未消费的消息

🔷双端队列图解如下:

在这里插入图片描述

解析: 双端队列模式只能有一个或多个消费者轮着去消费,却不能将消息同时发给其他消费者

🔶发布/订阅模式图解如下:

在这里插入图片描述

解析: redis 订阅发布模式,生产者生产完消息通过频道分发消息,给订阅了该频道的所有消费

发布/订阅如何使用?

Redis有两种发布/订阅模式:

  • 基于频道(Channel)的发布/订阅
  • 基于模式(pattern)的发布/订阅
  • 操作命令
  1. 基于频道
命令描述
subscribe channel [channel … ]订阅给定的一个或多个频道
unsubscribe channel [channel … ]退订给定的频道,说明:若没有指定channel,则默认退订所有频道
publish channel message将消息发送给指定频道 channel ,返回结果:接收到信息的订阅者数量,无订阅者返回0
pubsub channels [argument [atgument …] ]查看订阅与发布系统的状态,说明:返回活跃频道列表(即至少有一个订阅者的频道,订阅模式的客户端除外)
  1. 基于模式
命令描述
psubscribe pattern1 [pattern…]订阅一个或多个符合给定模式的频道,说明:每个模式以 * 作为匹配符;例如 cn* 匹配所有以cn开头的频道:cn.java、cn.csdn
punsubscribe [pattern [pattern …] ]退订所有给定模式的频道,说明:pattern 未指定,则订阅的所有模式都会被退订,否则只退订指定的订阅的模式

1️⃣基于频道发布

“发布/订阅” 包含2种角色:发布者和订阅者。
发布者可以向指定的频道(channel)发送消息;
订阅者可以订阅一个或者多个频道(channel),所有订阅此频道的订阅者都会收到此消息。

在这里插入图片描述

SUBSCRIBE:频道订阅

用户可以通过执行 SUBSCRIBE 命令,让客户端订阅给定的一个或多个频道。

# 示例:
127.0.0.1:6379> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"		返回值类型:表示订阅成功!
2) "news"			订阅频道的名称
3) (integer) 1		当前客户端已订阅频道的数量# 语法解析:
subscribe		订阅命令
news			订阅频道# 注意:订阅后,该客户端会一直监听消息,如果发送者有消息发给频道,这里会立刻接收到消息

注意:进入订阅状态的客户端,不能使用除了 subscribe、unsubscribe、psubscribe 和 punsubscribe 这四个属于"发布/订阅"之外的命令,否则会报错!

——这里的客户端指的是 jedis、lettuce 的客户端,redis-cli 是无法退出订阅状态的!

PUBLISH:向频道发送消息

用户可以通过执行 PUBLISH 命令,将一条消息发送至给定频道

# 示例:
127.0.0.1:6379> PUBLISH news "hello world"
(integer) 1			# 接收到信息的订阅者数量,无订阅者返回0
127.0.0.1:6379> # 语法解析:
publish			命令
news			订阅频道名
hello world		消息内容

在这里插入图片描述

UNSUBSCRIBE:退订频道

用户在使用 SUBSCRIBE 命令订阅一个或多个频道之后,如果不想再收到某个频道的消息,那么可以使用 UNSUBSCRIBE 命令退订指定的频道。

UNSUBSCRIBE 命令允许用户给定任意多个频道。如果用户没有给定任何频道,直接以无参数方式执行 UNSUBSCRIBE 命令,那么命令将退订当前客户端已经订阅的所有频道。

2️⃣ 基于模式(pattern)的发布/订阅

如果有某个/某些模式和该频道匹配,所有订阅这个/这些频道的客户端也同样会收到信息。

图解

下图展示了一个带有频道和模式的例子, 其中 com.ahead.\* 频道匹配了 com.ahead.juc 频道和 com.ahead.thread 频道, 并且有不同的客户端分别订阅它们三个,如下图:

当有信息发送到 com.ahead.thread 频道时, 信息除了发送给 client 4client 5 之外, 还会发送给订阅 com.ahead.* 频道模式的 client xclient y

在这里插入图片描述

🔷 解析:

反之也是,如果当有消息发送给 com.ahead.juc 频道,消息发送给订阅了 juc 频道的客户端之外,还会发送给订阅了 com.ahead.* 频道的客户端: client x 、client y

🔶 注意:

通配符中 ? 表示1个占位符

* 表示任意个占位符(包括0)

?* 表示1个以上占位符。

PSUBSCRIBE:模式订阅

用户可以通过执行 PSUBSCRIBE 命令,让客户端订阅给定的一个或多个模式。

# 示例:
127.0.0.1:6379> PSUBSCRIBE a? news.*			# 订阅 “a?” "com.*" 2种模式频道
Reading messages... (press Ctrl-C to quit)		# 进入订阅状态后处于阻塞,可以按Ctrl+C键退出订阅状态
1) "psubscribe"			返回值的类型:显示订阅成功
2) "a?"					订阅的模式
3) (integer) 1			目前已订阅的模式的数量1) "psubscribe"
2) "news.*"
3) (integer) 21) "pmessage"			返回值的类型:信息
2) "a?"					信息匹配的模式:a?
3) "ab"					信息本身的目标频道:aa
4) "hello world"		信息的内容:"hello world"1) "pmessage"
2) "news.*"
3) "news.dbname"
4) "redis mysql oracle"

在这里插入图片描述

PUBLISH:模式发布

# 示例:
# 发布者第一条命令
# 结果:没有接收到消息,匹配失败,不满足 “a?” ,“?”表示一个占位符, a后面的sdf有3个占位符
127.0.0.1:6379> PUBLISH asdf "hello world"
(integer) 0# 发布者第二条命令,匹配到一个订阅
127.0.0.1:6379> PUBLISH ab "hello world"
(integer) 1# 发布者第二条命令,news.dbname 满足 new.* 匹配规则
127.0.0.1:6379> PUBLISH news.dbname "redis mysql oracle"
(integer) 1
127.0.0.1:6379> 

在这里插入图片描述

PUNSUBSCRIBE:退订模式

与退订频道的 UNSUBSCRIBE 命令类似,Redis 也提供了用于退订模式的 PUNSUBSCRIBE 命令

PUNSUBSCRIBE [pattern [pattern ...]]
# 示例:
PUNSUBSCRIBE news.*
  • 如果用户没有给定任何模式,那么命令将退订当前客户端已订阅的所有模式。

UNSUBSCRIBE 命令一样,各个客户端对于 PUNSUBSCRIBE 命令的需求也是不同的,有些客户端需要用到PUNSUBSCRIBE 命令,而有些客户端则不需要。

例如:

Redis自带的命令行客户端 redis-cli 在执行 PSUBSCRIBE 命令之后就会进入阻塞状态,只能通过同时按下Ctrl键和C键来退出程序,因此它并不需要用到 PUNSUBSCRIBE 命令。

查看被订阅的频道

用户可以通过执行 PUBSUB CHANNELS 命令来列出目前被订阅的所有频道,如果给定了可选的 pattern 参数,那么命令只会列出与给定模式相匹配的频道。

PUBSUB CHANNELS [pattern]# 示例:
127.0.0.1:6379> PUBSUB CHANNELS127.0.0.1:6379> PUBSUB CHANNELS news.*

查看频道的订阅者数量

用户可以通过执行 PUBSUB NUMSUB 命令,查看任意多个给定频道的订阅者数量

PUBSUB NUMSUB [channel [channel ...]]
# 示例:
PUBSUB NUMSUB news.dbname
1) "news.dbname"
2) (integer) 2		频道订阅数量

查看被订阅模式的总数量

通过执行 PUBSUB NUMPAT 命令,用户可以看到目前被订阅模式的总数量

# 示例:
127.0.0.1:6379> PUBSUB NUMPAT
(integer) 2

3️⃣ 使用注意

  • 客户端需要及时消费和处理消息。

    客户端订阅了 channel 之后,如果接收消息不及时,可能导致 DCS 实例消息堆积,当达到消息堆积阈值(默认值为32MB),或者达到某种程度(默认8MB)一段时间(默认为1分钟)后,服务器端会自动断开该客户端连接,避免导致内部内存耗尽。

  • 客户端需要支持重连。

    当连接断开之后,客户端需要使用 subscribe 或者 psubscribe 重新进行订阅,否则无法继续接收消息。

  • 不建议用于消息可靠性要求高的场景中。

    Redis的 pubsub 不是一种可靠的消息系统。当出现客户端连接退出,或者极端情况下服务端发生主备切换时,未消费的消息会被丢弃。

 
 
 
 
 


http://chatgpt.dhexx.cn/article/MONhXhdK.shtml

相关文章

Redis的发布订阅

Redis的发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送信息,订阅者(sub)接收信息。Redis客户端可以订阅任意数量的频道。Pub/Sub 从字面上理解就是发布(Publish&a…

Redis数据库的发布与订阅(详细讲解)

一、实验目的 了解Redis数据库的发布与订阅 二、发布与订阅 1.1什么是发布和订阅 发布订阅是一对多的关系,需要有信息的发布者和消息的收听者。 发布者:提供某个内容或主题,把内容信息发送给多个对此内容感兴趣的订阅者 订阅者&#xff…

Redis发布和订阅

一、什么是Redis发布和订阅 Redis的发布(pub)和订阅(sub)是一种消息通信模式。它包含有三个角色分别是:发送者、订阅者、频道。 Redis客户端可以订阅多个任意的频道。 Redis发布和订阅的结构图: 发送者:用于发送消息 订阅者:订阅…

Redis--发布订阅--原理/使用场景

原文网址:Redis--发布订阅--原理/使用场景_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Redis的发布订阅功能。 Redis发布订阅简述 Redis提供了基于“发布/订阅”模式的消息机制。此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端…

php查netstat,netstat怎么查看端口状态

netstat查看端口状态的方法:首先打开终端命令窗口;然后通过命令“netstat -ntlp”查看当前所有tcp端口;最后通过“netstat -ntulp | grep 80”命令查看所有80端口使用情况即可。 本教程操作环境:linux5.9.8系统,DELL G…

Linux系统使用ss命令查看端口状态

Linux系统使用ss命令查看端口状态 Linux系统使用ss命令查看端口状态 目录 1.可用工具 2.ss帮助 2.1 选项分类说明 2.2 过滤选项family 2.3 过滤选项state 2.4 状态之间的关系 3.ss的使用 3.1 使用示例 3.2 过滤 3.2.1 状态过滤 3.2.2 通过family过滤 3.2.3 使用地址和端口过滤 …

Win7怎样查看端口状态

在Win7系统中,查看端口状态可以采用以下两种方法: 1.netstat 先单击“开始”,再单击“运行”,输入"cmd",进入DOS窗口。输入命令"netstat -na",按回车,就会显示本机连接情况…

Linux查看端口状态

在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 netstat命令各个参数说明如下: -t : 指明显示TCP端口   -u : 指明显示UDP端口   -l : 仅显示…

php 查看端口配置信息,查看端口状态的命令是什么

查看端口状态的命令是“netstat”,其语法是“netstat -ntlp”,netstat命令一般用于检验本机各端口的网络连接情况,netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听等相关报告。 linux系统中查…

通过查看端口状态查看mongodb是否已经启动

LINUX环境下,可以通过查看端口27017的状态查看mongod是否已经启动。 netstat -lanp | grep "27017" 可以看到已经启动了mongod服务。 然后关闭mongod服务 sudo service mongod stop 可以看到端口状态发生了变化 再开启服务 sudo service mongod star…

Linux查看端口状态及 查看与其他主机的联通状态 命令

目录 netstat Telnet netstat 在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 netstat命令各个参数说明如下: -t : 指明显示TCP端口 -u : 指明…

Ubuntu开放端口及其查看端口开放状态

前言 在服务器部署应用的时候,我们经常要查看这个应用是否部署成功,而一般就是通过ip 端口的方式在浏览器上进行查看默认的一些页面是否出现当页面没有出现的情况下,不一定是应用没启动成功,可能是因为端口未开放出去&#xff0…

netstat查看端口状态

netstat(network status网络状态)命令各个参数说明如下: -t : 指明显示TCP端口,t是TCP的首字母。 -u : 指明显示UDP端口,u是UDP的首字母 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(proto…

Netstat查看端口状态,netstat命令详解

netstat命令详解 概述Netstat查看端口状态 概述 netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。 Netstat查看端口状态 1、点击左下角的【开始】,找到运行,或是直接…

聊聊linux查看服务和端口状态命令netstat

使用netstat命令可以查看linux系统中正在使用的服务和端口情况 常见参数 -a (all)显示所有选项,默认不显示LISTEN相关 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示别名,能显示数字的全部转化成数字。 -l 仅列出有在 Listen (监听…

linux中查看端口状态以及是否被占用的相关操作指令(netstat、isof)

linux中查看端口状态 linux中查看端口状态1、netstat1.1、查看服务器上服务和端口1.2、查看某个端口是否被占用 2、lsof:进程打开文件的相关信息2.1、列出80端口目前打开的文件列表2.2、列出所有的网络连接2.3、查看进程打开了某个文件2.4、查看某个用户打开的所有文…

绝对优势与比较优势的数学分析与其…

广义动量定理与系统思考 ——战争、管理学与经济学通论 2.4 作用点与经济学 2.4.1 作用点与比较优势 当有n国生产2种产品时,可以写出如下的带约束的函数, 其中Fi1和Fi2分别为i国生产1单位产品1和产品2所需劳动量,xi…

新-新古典综合给出的正统答案-中国视角下的宏观经济

新-新古典综合给出的正统答案-潘登同学的宏观经济学笔记 文章目录 新-新古典综合给出的正统答案-潘登同学的宏观经济学笔记 当前主流宏观经济学(新-新古典综合)的思想源流古典理论凯恩斯理论新古典综合(neoclassical synthesis)新-新古典综合(New-neoclassical synthesis) 宏观…

经济学计算机会成本,经济学思维方式之二——机会成本、经济利润

今天的内容,顺着昨天的成本收益模型,来说一说经济学里两个重要的概念——机会成本和经济利润。 首先,说说我自己跨学科学习的理念。 跨学科学习学什么?学的是匪夷所思的概念和模型,是不通过系统学习,这辈子…

国内首次!3位清华姚班00后学霸斩获计算机理论顶会最佳学生论文奖

作者丨Joey 好困 来源丨新智元 【导读】2022年计算机理论顶会STOC正式开幕,来自清华姚班的三位00后学霸斩获最佳学生论文奖。 近日,理论计算机科学领域顶级国际会议第54届ACM计算理论年会(STOC 2022)拉开帷幕。 清华姚班的三位00后…