redis发布与订阅

article/2025/9/11 6:29:51

一、什么是发布和订阅

发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段。特别是在异构(不同语言)系统之间作用非常明显。发布订阅可以是实现应用(系统)之间的解耦合。

发布订阅:类似微信中关注公众号/订阅号,公众号/订阅号发布的文章,信息。订阅者能及时获取到最新的内容。微博的订阅也是类似的。日常生活中听广播,看电视。都需要有信息的发布者,收听的人需要订阅(广播、电视需要调动某个频道)。发布订阅是一对多的关系。

订阅:对某个内容感兴趣,需要实时获取新的内容。只要关注的内容有变化就能立即得到通知。多的一方。

发布:提供某个内容,把内容信息发送给多个对此内容感兴趣的订阅者。是有主动权,是一的一方。

发布订阅应用在即时通信应用中较多,比如网络聊天室,实时广播、实时提醒等。滴滴打车软件的抢单;外卖的抢单;在微信群发红包,抢红包都可以使用发布订阅实现。

二、Redis的发布和订阅

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接收消息。发布订阅也叫生产者消费者模式,是实现消息队列的一种方式。Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
在这里插入图片描述

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
在这里插入图片描述

三、命令学习

3.1 订阅

psubscribe pattern [pattern …] 订阅一个或多个符合给定模式的频道。返回值:接收到的信息

# 订阅 news.* 和 tweet.* 两个模式# 第 1 - 6 行是执行 psubscribe 之后的反馈信息
# 第 7 - 10 才是接收到的第一条信息
# 第 11 - 14 是第二条
# 以此类推。。。127.0.0.1:6379> psubscribe news.* tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"                  # 返回值的类型:显示订阅成功
2) "news.*"                      # 订阅的模式
3) (integer) 1                   # 目前已订阅的模式的数量1) "psubscribe"
2) "tweet.*"
3) (integer) 21) "pmessage"                    # 返回值的类型:信息
2) "news.*"                      # 信息匹配的模式
3) "news.it"                     # 信息本身的目标频道
4) "Google buy Motorola"         # 信息的内容1) "pmessage"
2) "tweet.*"
3) "tweet.huangz"
4) "hello"1) "pmessage"
2) "tweet.*"
3) "tweet.joe"
4) "@huangz morning"1) "pmessage"
2) "news.*"
3) "news.life"
4) "An apple a day, keep doctors away"

subscribe channel [channel …]:订阅给定的一个或多个频道的信息。
返回值:接收到的信息(请参见下面的代码说明)。

# 订阅 msg 和 chat_room 两个频道# 1 - 6 行是执行 subscribe 之后的反馈信息
# 第 7 - 9 行才是接收到的第一条信息
# 第 10 - 12 行是第二条127.0.0.1:6379> subscribe msg chat_room
Reading messages... (press Ctrl-C to quit)
1) "subscribe"       # 返回值的类型:显示订阅成功
2) "msg"             # 订阅的频道名字
3) (integer) 1       # 目前已订阅的频道数量1) "subscribe"
2) "chat_room"
3) (integer) 2#下面是接收到的信息1) "message"         # 返回值的类型:信息
2) "msg"             # 来源(从那个频道发送过来)
3) "hello moto"      # 信息内容1) "message"
2) "chat_room"
3) "testing...haha"
3.2 退订

unsubscribe [channel [channel …]]:指示客户端退订给定的频道。
返回值:这个命令在不同的客户端中有不同的表现。

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

127.0.0.1:6379> unsubscribe channel11
1) "unsubscribe"
2) "channel11"
3) (integer) 0

punsubscribe [pattern [pattern …]]:指示客户端退订所有给定模式。
返回值:这个命令在不同的客户端中有不同的表现。

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

3.3 发布

publish channel message:将信息 message 发送到指定的频道 channel
返回值:接收到信息 message 的订阅者数量。

# 对没有订阅者的频道发送信息
127.0.0.1:6379> publish bad_channel "can any body hear me?"
(integer) 0# 向有一个订阅者的频道发送信息
127.0.0.1:6379> publish msg "good morning"
(integer) 1# 向有多个订阅者的频道发送信息
127.0.0.1:6379> publish chat_room "hello~ everyone"
(integer) 3
3.4 查看订阅与发布系统状态

pubsub channels [pattern] : 列出当前的活跃频道。返回值: 一个由活跃频道组成的列表。

pattern 参数是可选的:
如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。
如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。
复杂度: O(N) , N 为活跃频道的数量(对于长度较短的频道和模式来说,将进行模式匹配的复杂度视为常数)。

127.0.0.1:6379> pubsub channels
1) "channel11"

pubsub numsub [channel-1 … channel-N]:返回给定频道的订阅者数量, 订阅模式的客户端不计算在内。

返回值: 一个多条批量回复(Multi-bulk reply),回复中包含给定的频道,以及频道的订阅者数量。 格式为:频道 channel-1 , channel-1 的订阅者数量,频道 channel-2 , channel-2 的订阅者数量,诸如此类。 回复中频道的排列顺序和执行命令时给定频道的排列顺序一致。 不给定任何频道而直接调用这个命令也是可以的, 在这种情况下, 命令只返回一个空列表。

127.0.0.1:6379> pubsub numsub channel11
1) "channel11"
2) (integer) 1

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

# client-1 订阅 news.* 和 discount.* 两个模式client-1> psubscribe news.* discount.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "psubscribe"
2) "discount.*"
3) (integer) 2# client-2 订阅 tweet.* 一个模式client-2> psubscribe tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "tweet.*"
3) (integer) 1# client-3 返回当前订阅模式的数量为 3client-3> pubsub numpat
(integer) 3# 注意,当有多个客户端订阅相同的模式时,相同的订阅也被计算在 PUBSUB NUMPAT 之内
# 比如说,再新建一个客户端 client-4 ,让它也订阅 news.* 频道client-4> psubscribe news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1# 这时再计算被订阅模式的数量,就会得到数量为 4client-3> pubsub numpat
(integer) 4

四、redis发布与订阅的缺陷

虽然redis实现了发布订阅(publish/subscribe)的功能,但是在通常的情况下是不推荐使用的,如果想使用消息队列这种功能,最好还是使用专业的各种MQ中间件,例如rabbitMQ,rockedMQ,activitedMQ等,本文主要讲一下不推荐使用redis的发布订阅功能的原因。

概要说一下就是,publish和subscribe的缺陷在于客户端必须一直在线才能接收到消息,断线可能会导致客户端丢失消息,除此之外,旧版的redis可能会由于订阅者消费不够快而变的不稳定导致崩溃,甚至被管理员杀掉

第一个原因是和redis系统的稳定性有关。对于旧版的redis来说,如果一个客户端订阅了某个或者某些频道,但是它读取消息的速度不够快,那么不断的积压的消息就会使得redis输出缓冲区的体积越来越大,这可能会导致redis的速度变慢,甚至直接崩溃。也可能会导致redis被操作系统强制杀死,甚至导致操作系统本身不可用。新版的redis不会出现这种问题,因为它会自动断开不符合client-output-buffer-limit pubsub配置选项要求的订阅客户端

第二个原因是和数据传输的可靠性有关。任何网络系统在执行操作时都可能会遇到断网的情况。而断线产生的连接错误通常会使得网络连接两端中的一端进行重新连接。如果客户端在执行订阅操作的过程中断线,那么客户端将会丢失在断线期间的消息,这在很多业务场景下是不可忍受的。


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

相关文章

redis的发布和订阅

1、什么是发布和订阅 redis发布订阅(pub/sub)是一种消息通信模式:发布者(pub)发布消息,订阅者(sub)接收消 息。 redis客户端可以订阅任意数量的频道。 2、redis的发布和订阅 1、客户…

Redis——Redis 的发布和订阅

Redis 的发布和订阅 文章目录 Redis 的发布和订阅1、什么是发布和订阅2、Redis 的发布和订阅3、发布订阅命令行实现 1、什么是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可…

Redis如何实现发布订阅功能

Redis如何实现发布订阅功能 文章目录 Redis如何实现发布订阅功能前言一、Redis发布订阅功能1. 发送消息2. 订阅某个频道3. 发布订阅的实现4. 总结 前言 Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者…

Java实现Redis的发布和订阅

Redis上的操作: 打开两个窗口,打开redis客户端: 一个客户端:订阅(客户端订阅channel1频道):127.0.0.1:6379> subscribe channel1 另一个客户端:发布(客户端向channel1频道发送消…

redis 发布订阅以及使用场景

redis 发布订阅 发布订阅模式:一个发布者多个订阅者只要选择订阅这个发布者,发布者发布的数据都可以被订阅到,只有订阅者开始订阅之后,发布的数据才可以接收,也就是说历史数据不能接收 127.0.0.1:6379> PUBLISH 163 hello (i…

Redis---订阅和发布

目录 消息系统命令 消息系统 ​ 发布/订阅,即 pub/sub,是一种消息通信模式:发布者也称为消息生产者,生产和发送消息到存储系统;订阅者也称为消息消费者,从存储系统接收和消费消息。这个存储系统可以是文件系…

Redis:Redis消息的发布与订阅(了解)

为了实现客户端的通信,提供了频道的概念 1.Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。 Redis发布订阅示意图 图一:消息订阅者…

Spring boot整合Redis实现发布订阅(超详细)

Redis发布订阅 基础知识相关命令订阅者/等待接收消息发布者/发送消息订阅者/成功接收消息常用命令汇总 原理Spring boot整合redis导入依赖Redis配置消息封装类(MessageDto)Redis配置类测试类订阅方实现一:RedisMessageListener订阅方实现二&a…

【redis】发布和订阅消息

1.说明 在Redis2版本之后支持发布订阅功能,发布者创建一个频道,并在上面发送消息,所有订阅该频道的客户端都能收到消息(不出意外的情况下,但实际不一定),发布订阅的好处是减少不必要的轮询&…

Redis的发布订阅模式

本文源码参看:https://github.com/duktig666/learn-example/tree/5586febea31c2fb368e19fbdba11ed08afd463e0/Redis/src/main/java/cn/duktig/pubsub Redis发布订阅概述 Redis 发布订阅 (publish/subscribe) 是一种消息通信模式:发送者 (pub) 发送消息…

Redis订阅和发布

1.发布和订阅 1.1什么是发布和订阅 发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段。特别是在异构(不 同语言)系统之间作用非常明显。发布订阅可以是实现应用(系统)之间的解耦合。…

Redis数据库的订阅发布

大家好,今天分享一下redis的订阅发布 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 (比如说,你在一个一个网站上面可以关注…

Redis订阅和发布(实操教学)

什么是Redis发布订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。 例1:client2,client5,client1订阅了频道channel1 例2:有新消息通过p…

Redis消息订阅发布

Redis的发布订阅(pub/sub)是一种 消息通信模式 : 发送者(pub)发送消息,订阅者(sub)接收消息 redis客户端可以订阅任意数量的频道 消息发送者 频道 消息接收者 redis频道 channel1 以及订阅这个频道的客户端client2 ; client5 ; client1 之间的关系 当有新消息通过PUBLISH 命…

Redis:发布订阅机制

参考资料: 《Redis进阶——发布订阅详解》 《Redis 发布订阅》 《Redis进阶 - 消息传递:发布订阅模式详解》 写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。 目录 一、什…

redis发布订阅

目录 一、概要 二、特点 三、发布及订阅功能 四、Redis发布订阅命令 五、php实现redis发布-订阅 1、消息发布端 2、消息订阅端 六、订阅发布使用场景 七、在订阅时遇到错误 八、模式匹配(正则匹配)订阅 一、概要 Redis发布订阅(pub/sub)是一种…

springboot 整合使用redis发布订阅功能

前言 发布订阅作为一种设计思想在很多开源组件中都有体现,比如大家熟知的消息中间件等,可谓把发布订阅这一思想体现的淋漓尽致了; 一、redis发布订阅简介 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。可以参考下面两张图进…

Redis进阶——发布订阅详解

什么是发布订阅? Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 的 subscribe 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发…

Redis 的发布与订阅

3、Redis 的发布与订阅 3.1、发布与订阅简述 Redis提供了基于“发布/订阅”模式的消息机制。此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道(channel) 发布消息,订阅该频道的每个客户端都可…

6. Redis 发布与订阅

文章目录 6. Redis 发布与订阅为什么需要发布、订阅发布/订阅如何使用? :one:基于频道发布SUBSCRIBE:频道订阅PUBLISH:向频道发送消息UNSUBSCRIBE:退订频道 :two: 基于模式(pattern)的发布/订阅PSUBSCRIBE:模式订阅PUB…