查看“Redis:发布/订阅(pub/sub)”的源代码
←
Redis:发布/订阅(pub/sub)
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Redis]] __TOC__ == 关于 == 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'''”等; 消息队列的三要素: # 生产者(producer) # 消费者(consumer) # 消息服务(broker) == 发布和订阅 == 正在订阅频道的客户端不应该发送除下述之外的其他命令: {| class="wikitable" |+ Redis:发布/订阅 命令 ! !! 命令 !! 描述 |- | rowspan="2" | 订阅频道 | SUBSCRIBE channel [channel ...] || '''订阅'''给定的一个或多个频道的信息。 |- | UNSUBSCRIBE [channel [channel ...]] || '''退订'''给定的频道。 |- | rowspan="2" | 订阅模式 | PSUBSCRIBE pattern [pattern ...] || '''订阅一个或多个'''符合给定模式的频道。 |- | PUNSUBSCRIBE [pattern [pattern ...]] || '''退订所有'''给定模式的频道。 |- | 发布 |- | PUBLISH channel message || 将信息'''发布'''到指定的频道。 |- | 状态 | 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 个为消息发布者: # 让 3 个消息订阅者订阅某个频道主题:“'''<code>subscribe channelTest</code>'''”; #: [[File:redis订阅channelTest.jpg|800px]] # 让 1 个消息发布者向频道主题上发布消息:“'''<code>publish channelTest message123</code>'''”; #: [[File:redis发布消息到channelTest.jpg|800px]] === 订阅模式 === <syntaxhighlight lang="java" highlight=""> // 订阅 psubscribe <pattern> [<pattern> ...] // 发布 publish <channel> <message> </syntaxhighlight> (以命令行模拟实现): # 订阅匹配模式的频道:“'''<code>psubscribe chan*</code>'''” #:[[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 。
返回至“
Redis:发布/订阅(pub/sub)
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息