“Redis:发布/订阅(pub/sub)”的版本间差异

来自Wikioe
跳到导航 跳到搜索
无编辑摘要
第3行: 第3行:
__TOC__
__TOC__


== 什么是发布订阅? ==
== 关于 ==
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接收消息。
SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH 三个命令实现了发布与订阅信息泛型(Publish/Subscribe messaging paradigm),在这个实现中:
* 发布订阅也叫“'''生产者消费者'''”模式,是实现“'''消息队列'''”的一种方式;
1、发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。
2、发送者无须知道任何关于订阅者的信息,而订阅者也无须知道是那个客户端给它发送信息,它只要关注自己感兴趣的频道即可。
对发布者和订阅者进行解构(decoupling), 可以极大地提高系统的扩展性(scalability), 并得到一个更动态的网络拓扑(network topology)。
 
发布订阅(pub/sub)是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接收消息。
:[[File:redis发布.png|left|thumb|200px|发布]] [[File:reids订阅.png|none|thumb|300px|订阅]]
 
 
=== “发布订阅”与“消息队列” ===
发布订阅也叫“'''生产者消费者'''”模式,是实现“'''消息队列'''”的一种方式。基于消息队列,可以实现系统解耦、削峰填谷,顶住流量洪峰。
* redis 的主业目前是基于键值对的数据存储、缓存等,消息队列可能是 redis 的一种尝试;
* 常用的流行的消息队列有:“'''ActiveMQ'''”、“'''RabbitMQ'''”等;




第13行: 第25行:
# 消息服务(broker)
# 消息服务(broker)


 
== 发布和订阅 ==
发布:
正在订阅频道的客户端不应该发送除下述之外的其他命令:
:[[File:redis发布.png|200px]]
订阅:
:[[File:reids订阅.png|200px]]
 
== Redis发布和订阅 ==
发布订阅是'''消息队列'''的一种方式,基于消息队列的方式,可以实现系统解耦、削峰填谷,顶住流量洪峰;
* redis 的主业目前是基于键值对的数据存储、缓存等,消息队列可能是 redis 的一种尝试;
* 常用的流行的消息队列有:“'''ActiveMQ'''”、“'''RabbitMQ'''”等;
 
=== 常用命令 ===
{| class="wikitable"
{| class="wikitable"
! 命令 !! 描述  
|+ Redis:发布/订阅 命令
!  !! 命令 !! 描述  
|-
|-
| rowspan="2" | 订阅频道
| SUBSCRIBE channel [channel ...] || '''订阅'''给定的一个或多个频道的信息。
| SUBSCRIBE channel [channel ...] || '''订阅'''给定的一个或多个频道的信息。
|-
|-
| UNSUBSCRIBE [channel [channel ...]] || '''退订'''给定的频道。  
| UNSUBSCRIBE [channel [channel ...]] || '''退订'''给定的频道。  
|-
|-
| rowspan="2" | 订阅模式
| PSUBSCRIBE pattern [pattern ...] || '''订阅一个或多个'''符合给定模式的频道。
| PSUBSCRIBE pattern [pattern ...] || '''订阅一个或多个'''符合给定模式的频道。
|-
|-
| PUNSUBSCRIBE [pattern [pattern ...]] || '''退订所有'''给定模式的频道。
| PUNSUBSCRIBE [pattern [pattern ...]] || '''退订所有'''给定模式的频道。
|-
|-
| PUBLISH channel message || 将信息发送到指定的频道。
| 发布
|-
| PUBLISH channel message || 将信息'''发布'''到指定的频道。
|-
|-
| 状态
| PUBSUB subcommand [argument [argument ...]] || 查看订阅与发布系统状态。
| PUBSUB subcommand [argument [argument ...]] || 查看订阅与发布系统状态。
|}
|}
* 客户端订阅的模式里面可以包含多个 glob 风格的通配符, 比如: '''*''' 、 '''?''' 和 '''[...]''',等等。
* 在执行 SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE 和 PUNSUBSCRIBE 命令时,返回结果的最后一个元素是客户端目前'''仍在订阅的频道和模式总数'''。
** 当客户端退订所有频道和模式,也即是这个总数值下降为 0 的时候,客户端将退出订阅与发布状态。
=== 订阅频道 ===
<syntaxhighlight lang="java" highlight="">
// 订阅
subscribe <channel> [<channel> ...]
// 发布
publish <channel> <message>
</syntaxhighlight>


=== 模拟实现 ===
(以命令行模拟实现):
(以命令行模拟实现):
# 开启 4 个 redis 客户端(“./redis-cli”),如上图,3 个客户端作为消息订阅者,1 个为消息发布者:
# 开启 4 个 redis 客户端(“./redis-cli”),如上图,3 个客户端作为消息订阅者,1 个为消息发布者:
# 让 3 个消息订阅者订阅某个频道主题:“'''<code>subscribe channelTest</code>'''”;
# 让 3 个消息订阅者订阅某个频道主题:“'''<code>subscribe channelTest</code>'''”;
#: <syntaxhighlight lang="java" highlight="">
subscribe channel [channel ...]
</syntaxhighlight>
#: [[File:redis订阅channelTest.jpg|800px]]
#: [[File:redis订阅channelTest.jpg|800px]]
# 让1个消息发布者向频道主题上发布消息:“'''<code>publish channelTest message123</code>'''”;
# 让 1 个消息发布者向频道主题上发布消息:“'''<code>publish channelTest message123</code>'''”;
#: <syntaxhighlight lang="java" highlight="">
publish channel message
</syntaxhighlight>
#: [[File:redis发布消息到channelTest.jpg|800px]]
#: [[File:redis发布消息到channelTest.jpg|800px]]


=== 订阅模式 ===
<syntaxhighlight lang="java" highlight="">
// 订阅
psubscribe <pattern> [<pattern> ...]


// 发布
publish <channel> <message>
</syntaxhighlight>


 
(以命令行模拟实现):
如果是订阅匹配模式的频道主题:“'''<code>psubscribe chan*</code>'''”
# 订阅匹配模式的频道:“'''<code>psubscribe chan*</code>'''”
# 订阅:
#: <syntaxhighlight lang="java" highlight="">
psubscribe pattern [pattern ...]
</syntaxhighlight>
#:[[File:redis订阅(psubscribe).jpg|800px]]
#:[[File:redis订阅(psubscribe).jpg|800px]]
# 发布:
# 发布:
#:[[File:redis发布(psubscribe).jpg|800px]]
#:[[File:redis发布(psubscribe).jpg|800px]]
== 信息的格式 ==
== FAQ ==
=== 通过频道和模式接收同一条信息 ===
如果客户端订阅的多个模式匹配了同一个频道,或者客户端同时订阅了某个频道、以及匹配这个频道的某个模式,那么它可能会多次接收到同一条信息。
示例:
: 如果客户端执行了以下命令:
: <syntaxhighlight lang="cmd" highlight="">
SUBSCRIBE foo
PSUBSCRIBE f*
</syntaxhighlight>
: 当有信息发送到频道 foo 时,客户端将收到两条信息:一条来自频道 foo,信息类型为 message;另一条来自模式 f*,信息类型为 pmessage 。

2021年11月2日 (二) 23:49的版本


关于

SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH 三个命令实现了发布与订阅信息泛型(Publish/Subscribe messaging paradigm),在这个实现中:
1、发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。
2、发送者无须知道任何关于订阅者的信息,而订阅者也无须知道是那个客户端给它发送信息,它只要关注自己感兴趣的频道即可。

对发布者和订阅者进行解构(decoupling), 可以极大地提高系统的扩展性(scalability), 并得到一个更动态的网络拓扑(network topology)。

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

发布
订阅


“发布订阅”与“消息队列”

发布订阅也叫“生产者消费者”模式,是实现“消息队列”的一种方式。基于消息队列,可以实现系统解耦、削峰填谷,顶住流量洪峰。

  • redis 的主业目前是基于键值对的数据存储、缓存等,消息队列可能是 redis 的一种尝试;
  • 常用的流行的消息队列有:“ActiveMQ”、“RabbitMQ”等;


消息队列的三要素:

  1. 生产者(producer)
  2. 消费者(consumer)
  3. 消息服务(broker)

发布和订阅

正在订阅频道的客户端不应该发送除下述之外的其他命令:

Redis:发布/订阅 命令
命令 描述
订阅频道 SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道的信息。
UNSUBSCRIBE [channel [channel ...]] 退订给定的频道。
订阅模式 PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道。
PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道。
发布
PUBLISH channel message 将信息发布到指定的频道。
状态 PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态。
  • 客户端订阅的模式里面可以包含多个 glob 风格的通配符, 比如: *?[...],等等。
  • 在执行 SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE 和 PUNSUBSCRIBE 命令时,返回结果的最后一个元素是客户端目前仍在订阅的频道和模式总数
    • 当客户端退订所有频道和模式,也即是这个总数值下降为 0 的时候,客户端将退出订阅与发布状态。

订阅频道

// 订阅
subscribe <channel> [<channel> ...]

// 发布
publish <channel> <message>

(以命令行模拟实现):

  1. 开启 4 个 redis 客户端(“./redis-cli”),如上图,3 个客户端作为消息订阅者,1 个为消息发布者:
  2. 让 3 个消息订阅者订阅某个频道主题:“subscribe channelTest”;
    Redis订阅channelTest.jpg
  3. 让 1 个消息发布者向频道主题上发布消息:“publish channelTest message123”;
    Redis发布消息到channelTest.jpg

订阅模式

// 订阅
psubscribe <pattern> [<pattern> ...]

// 发布
publish <channel> <message>

(以命令行模拟实现):

  1. 订阅匹配模式的频道:“psubscribe chan*
    Redis订阅(psubscribe).jpg
  2. 发布:
    Redis发布(psubscribe).jpg

信息的格式

FAQ

通过频道和模式接收同一条信息

如果客户端订阅的多个模式匹配了同一个频道,或者客户端同时订阅了某个频道、以及匹配这个频道的某个模式,那么它可能会多次接收到同一条信息。


示例:

如果客户端执行了以下命令:
SUBSCRIBE foo
PSUBSCRIBE f*
当有信息发送到频道 foo 时,客户端将收到两条信息:一条来自频道 foo,信息类型为 message;另一条来自模式 f*,信息类型为 pmessage 。