【Redis 】发布订阅(pub/sub)

本文深入讲解Redis的发布订阅(pub/sub)功能,介绍消息通信模式如何让发送者(pub)向订阅者(sub)推送消息。通过实例演示如何使用Redis命令进行频道订阅与消息发布,并列举了发布订阅模式下的常用命令。此外,还探讨了该模式在实际场景中的应用。

Redis 发布订阅(pub/sub)

一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。

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

在这里插入图片描述

实例

以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 CCTV:

redis 127.0.0.1:6379> SUBSCRIBE CCTV

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "CCTV"
3) (integer) 1


redis 127.0.0.1:6379> PUBLISH CCTV "优秀"

(integer) 1

redis 127.0.0.1:6379> PUBLISH CCTV "可爱"

(integer) 1

现在,我们先重新开启个 redis 客户端,然后在同一个频道 CCTV 发布两次消息,订阅者就能接收到消息。

# 订阅者的客户端会显示如下消息
1) "message"
2) "CCTV"
3) "优秀"

1) "message"
2) "CCTV"
3) "可爱"

发布订阅命令

PSUBSCRIBE pattern [pattern …] 订阅一个或多个符合给定模式的频道。

PUBSUB subcommand [argument [argument …]] 查看订阅与发布系统状态。

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

PUNSUBSCRIBE [pattern [pattern …]] 退订所有给定模式的频道。

SUBSCRIBE channel [channel …] 订阅给定的一个或多个频道的信息。

UNSUBSCRIBE [channel [channel …]] 指退订给定的频道。

应用场景

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hyeI1CyY-1579611552338)(4E24CFEE092C4D3AAFA3161FE9BF149C)]

### Redis Pub/Sub 的工作原理 Redis 的发布/订阅(Pub/Sub)系统是一种消息通信模式,它允许发送者(publisher)将消息发送到频道(channel),而订阅者(subscriber)可以订阅一个或多个频道来接收这些消息。这种机制非常适合用于构建实时消息传递系统、事件驱动架构等[^3]。 Redis Pub/Sub 直接在 Redis 服务器中实现。客户端连接到 Redis 服务器,并将消息发布到频道或订阅频道以接收消息。Redis 服务器充当消息代理,将消息从发布者路由到订阅者。 Pub/Sub 本质上是异步的。发布者不会等待订阅者接收消息,订阅者会在消息发布时接收消息。Pub/Sub 将发布者和订阅者分离。发布者不需要了解订阅者的任何信息,订阅者也不需要了解发布者的任何信息。这使得构建可扩展且可维护的系统变得更加容易。一对多通信:发布到频道的单条消息可以被多个订阅者接收[^2]。 ### Redis Pub/Sub 的使用方法 要使用 RedisPub/Sub 功能,可以通过以下几种方式: 1. **PUBLISH 命令**:用于向指定的频道发送消息。 ```shell PUBLISH mychannel "Hello, world!" ``` 这条命令会向名为 `mychannel` 的频道发送一条消息 "Hello, world!"。 2. **SUBSCRIBE 命令**:用于订阅一个或多个频道。 ```shell SUBSCRIBE mychannel ``` 这条命令会让客户端进入订阅模式,并开始监听 `mychannel` 频道的消息。 3. **UNSUBSCRIBE 命令**:用于取消订阅一个或多个频道。 ```shell UNSUBSCRIBE mychannel ``` 4. **PSUBSCRIBE 命令**:用于通过模式匹配订阅多个频道。 ```shell PSUBSCRIBE news.* ``` 这条命令会让客户端订阅所有符合 `news.*` 模式的频道。 5. **PUNSUBSCRIBE 命令**:用于取消通过模式匹配订阅的频道。 ```shell PUNSUBSCRIBE news.* ``` ### Redis Pub/Sub 的局限性 尽管 Redis Pub/Sub 提供了简单而强大的消息传递功能,但它也有其局限性,如消息不持久化、无法保证所有订阅者都接收到消息等。在需要消息持久化和可靠传递的场景下,建议结合使用Redis Streams或其他专业的消息队列系统。此外,合理的系统设计、错误处理和性能优化是确保Pub/Sub系统稳定运行的关键[^1]。 对于需要消息可靠传递或历史消息重放的场景,可以选择其他更合适的消息队列系统,例如 Kafka 或 RabbitMQ。Kafka 提供优秀的持久化能力,适合日志和事件流;RabbitMQ 提供持久化功能,适合需要高可靠性的场景[^4]。 ### 示例代码 以下是一个简单的生产者示例,展示如何使用 Redisson 客户端发布消息到特定频道: ```java /** * 发布消息到 Topic * @param message 消息 * @return 接收消息的客户端数量 */ public long sendMessage(String message) { RTopic topic = redissonClient.getTopic(CHANNEL); long publish = topic.publish(message); log.info("生产者发送消息成功,msg = {}", message); return publish; } ``` 这段代码展示了如何使用 Redisson 客户端发布消息到特定频道,并记录发布的消息内容以及接收该消息的客户端数量[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值