Redis进阶 - 消息传递:发布订阅模式详解

本文介绍发布订阅,本质上跟消息队列的发布订阅没什么两样,都是广播。

介绍

Redis 发布订阅(Publish / Subscribe,简称 Pub/Sub)是一种消息通信模式。 它允许消息的发送者(发布者)把消息发送到某个频道(Channel),而消息的接收者(订阅者)可以订阅一个或多个频道,从而实时接收消息。

img

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

img

发布订阅使用方法

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个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP