Redis进阶 - 消息传递:发布订阅模式详解
本文介绍发布订阅,本质上跟消息队列的发布订阅没什么两样,都是广播。
介绍
Redis 发布订阅(Publish / Subscribe,简称 Pub/Sub)是一种消息通信模式。 它允许消息的发送者(发布者)把消息发送到某个频道(Channel),而消息的接收者(订阅者)可以订阅一个或多个频道,从而实时接收消息。

有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

发布订阅使用方法
Redis 的 发布订阅机制(Pub/Sub)中有两种订阅方式:基于频道 和 基于模式。
基于频道
- 订阅者直接订阅一个或多个具体的频道名字。
- 发布者只有发布到这些具体频道的消息,订阅者才会收到。
- 本质上是 “广播”:同一频道的消息会被所有订阅它的客户端接收。
使用命令:
| 命令 | 作用 | 示例 |
|---|---|---|
SUBSCRIBE <channel> | 订阅一个或多个频道 | SUBSCRIBE news |
UNSUBSCRIBE <channel> | 取消订阅一个或多个频道 | UNSUBSCRIBE news |
PUBLISH <channel> <message> | 发布消息到指定频道 | PUBLISH news "Hello" |
PUBSUB CHANNELS | 列出当前存在的频道 | PUBSUB CHANNELS |
PUBSUB NUMSUB <channel> | 查看频道订阅者数量 | PUBSUB NUMSUB news |
订阅端使用:
不用声明频道,直接订阅,自动生成。
▼bash复制代码# 订阅名为 "news" 的频道 127.0.0.1:6379> SUBSCRIBE news Reading messages... (press Ctrl-C to quit) # 输出结果类似: # 1) "subscribe" -> 订阅确认 # 2) "news" -> 频道名 # 3) (integer) 1 -> 当前订阅该频道的客户端数量
发布端使用:
▼bash复制代码# 向 "news" 频道发送一条消息 127.0.0.1:6379> PUBLISH news "hello!" # 返回值:(integer) 1 # 1 表示有 1 个订阅者接收到这条消息
然后订阅端会看到:
▼bash复制代码1) "message" # 表示收到消息 2) "news" # 表示频道名字 3) "hello" # 消息内容
基于模式订阅
- 订阅者可以订阅符合特定通配符模式的多个频道。
- 只要频道名匹配模式,订阅者就会收到消息。
刚刚是订阅单个频道,其实也支持订阅多个频道。
使用命令:
| 命令 | 作用 | 示例 |
|---|---|---|
PSUBSCRIBE <pattern> | 按模式订阅频道 | PSUBSCRIBE news:* |
PUNSUBSCRIBE <pattern> | 取消模式订阅 | PUNSUBSCRIBE news:* |
PUBLISH <channel> <message> | 向频道发布消息(同频道订阅) | PUBLISH news:tech "New tech update" |
订阅者:
使用通配符 *
▼bash复制代码# 订阅所有以 "news:" 开头的频道 127.0.0.1:6379> PSUBSCRIBE news:* Reading messages... (press Ctrl-C to quit) # 输出: # 1) "psubscribe" -> 模式订阅确认 # 2) "news:*" -> 模式名 # 3) (integer) 1 -> 当前模式订阅数量
发布者:
发布任意频道的新闻,只有是news开头,上面的订阅者都能收到。
▼bash复制代码# 发布消息到多个匹配模式的频道 127.0.0.1:6379> PUBLISH news:sports "Sports news update!" (integer) 1 127.0.0.1:6379> PUBLISH news:tech "Tech news update!" (integer) 1
取消订阅:
▼bash复制代码# 取消模式订阅 127.0.0.1:6379> PUNSUBSCRIBE news:* # 输出: # 1) "punsubscribe" # 2) "news:*" # 3) (integer) 0 -> 当前已经没有模式订阅
SpringBoot结合Redis发布/订阅实例
最佳实践是通过RedisTemplate,关键代码如下:
▼java复制代码// 发布 redisTemplate.convertAndSend("my_topic_name", "message_content"); // 配置订阅 RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(xxxMessageListenerAdapter, "my_topic_name");
我找了一篇文章,如果需要可以看看具体的集成
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
