Redis--pub/sub(发布与订阅)
来源:互联网 发布:人工智能的龙头股 编辑:程序博客网 时间:2024/06/10 02:17
SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH 三个命令实现了发布与订阅信息模型, 在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端), 而是将信息发送给某个通道,然后由通道将信息转发给所有对这个频道感兴趣的订阅者。发送者无须知道任何关于订阅者的信息, 而订阅者也无须知道是那个客户端给它发送信息,它只要关注自己感兴趣的通道即可。
对发布者和订阅者进行解耦, 可以极大地提高系统的扩展性, 并得到一个更动态的网络拓扑。比如说, 要订阅频道 foo 和 bar , 客户端可以使用通道名字作为参数来调用 SUBSCRIBE 命令:
redis>SUBSCRIBE foo bar
当有客户端发送信息到这些通道时,Redis 会将传入的信息推送到所有订阅这些通道的客户端里面。
正在订阅通道的客户端不应该发送除 SUBSCRIBE 和 UNSUBSCRIBE 之外的其他命令。 其中, SUBSCRIBE 可以用于订阅更多通道, 而UNSUBSCRIBE 则可以用于退订已订阅的一个或多个通道。
SUBSCRIBE 和 UNSUBSCRIBE 的执行结果会以信息的形式返回, 客户端可以通过分析所接收信息的第一个元素, 从而判断所收到的内容是一条真正的信息,还是 SUBSCRIBE 或 UNSUBSCRIBE 命令的操作结果。
信息的格式
通道转发的每条信息都是一条带有三个元素的多条批量回复(multi-bulkreply)。
信息的第一个元素标识了信息的类型:
- subscribe : 表示当前客户端成功地订阅了信息第二个元素所指示的频道。 而信息的第三个元素则记录了目前客户端已订阅频道的总数。
- unsubscribe : 表示当前客户端成功地退订了信息第二个元素所指示的频道。 信息的第三个元素记录了客户端目前仍在订阅的频道数量。 当客户端订阅的频道数量降为 0 时, 客户端不再订阅任何频道, 它可以像往常一样, 执行任何 Redis 命令。
- message : 表示这条信息是由某个客户端执行 PUBLISH 命令所发送的, 真正的信息。 信息的第二个元素是信息来源的频道, 而第三个元素则是信息的内容。
举个例子,如果客户端执行以下命令:
redis>SUBSCRIBE first second
那么它将收到以下回复:
1)"subscribe"
2) "first"
3) (integer) 1
1)"subscribe"
2) "second"
3) (integer) 2
如果在这时, 另一个客户端执行以下 PUBLISH 命令:
redis>PUBLISH second Hello
那么之前订阅了 second 频道的客户端将收到以下信息:
1)"message"
2) "second"
3) "hello"
当订阅者决定退订所有频道时, 它可以执行一个无参数的 UNSUBSCRIBE 命令:
redis>UNSUBSCRIBE
这个命令将接到以下回复:
1)"unsubscribe"
2) "second"
3) (integer) 1
1)"unsubscribe"
2) "first"
3) (integer) 0
订阅模式
Redis 的发布与订阅实现支持模式匹配: 客户端可以订阅一个带 * 号的模式, 如果某个/某些频道的名字和这个模式匹配, 那么当有信息发送给这个/这些频道的时候, 客户端也会收到这个/这些频道的信息。
比如说,执行命令
redis>PSUBSCRIBE news.*
的客户端将收到来自 news.art.figurative 、 news.music.jazz 等频道的信息。
客户端订阅的模式里面可以包含多个 glob 风格的通配符, 比如 * 、 ? 和 [...] , 等等。
执行命令
redis>PUNSUBSCRIBE news.*
将退订 news.* 模式, 其他已订阅的模式不会被影响。
通过订阅模式接收到的信息,和通过订阅频道接收到的信息, 这两者的格式不太一样:
- 通过订阅模式而接收到的信息的类型为 pmessage : 这代表有某个客户端通过 PUBLISH 向某个频道发送了信息, 而这个频道刚好匹配了当前客户端所订阅的某个模式。 信息的第二个元素记录了被匹配的模式, 第三个元素记录了被匹配的频道的名字, 最后一个元素则记录了信息的实际内容。
客户端处理 PSUBSCRIBE 和 PUNSUBSCRIBE 返回值的方式, 和客户端处理 SUBSCRIBE 和 UNSUBSCRIBE 的方式类似: 通过对信息的第一个元素进行分析, 客户端可以判断接收到的信息是一个真正的信息, 还是 PSUBSCRIBE 或 PUNSUBSCRIBE 命令的返回值。
通过频道和模式接收同一条信息
如果客户端订阅的多个模式匹配了同一个频道,或者客户端同时订阅了某个频道、以及匹配这个频道的某个模式, 那么它可能会多次接收到同一条信息。
举个例子,如果客户端执行了以下命令:
SUBSCRIBEfoo
PSUBSCRIBE f*
那么当有信息发送到频道 foo 时, 客户端将收到两条信息: 一条来自频道 foo ,信息类型为 message ; 另一条来自模式 f* ,信息类型为 pmessage 。
订阅总数
在执行 SUBSCRIBE 、 UNSUBSCRIBE 、 PSUBSCRIBE 和 PUNSUBSCRIBE 命令时, 返回结果的最后一个元素是客户端目前仍在订阅的频道和模式总数。
当客户端退订所有频道和模式, 也即是这个总数值下降为 0 的时候, 客户端将退出订阅与发布状态。
- Redis发布与订阅(pub/sub)
- Redis--pub/sub(发布与订阅)
- (十一)redis 发布与订阅(pub/sub)
- NoSQL之Redis---PUB/SUB(订阅与发布)---基本命令
- NoSQL之Redis---PUB/SUB(订阅与发布)---JAVA实现
- Redis Pub发布/sub订阅实现机制
- 9.Redis发布及订阅(pub/sub)
- Redis发布及订阅消息(pub/sub)
- Redis的发布/订阅(pub/sub)
- Pub/Sub 发布订阅
- 发布/订阅(Pub/Sub)
- redis命令详解与使用场景举例——Pub与Sub(发布订阅)
- Redis的pub/Sub(订阅与发布)在java中的实践
- Redis命令学习-Pub/Sub(发布/订阅)
- redis源码分析之发布订阅(pub/sub)
- 分布式缓存Redis之发布/订阅(Pub/Sub)
- Spring-data-redis: pub/sub消息订阅
- Spring-data-redis: pub/sub消息订阅
- Android Studio 连不上手机设备 error: no device found
- 玉蟾宫(单调栈+悬线法) codevs 2491
- 三种常见字符编码简介:ASCII、Unicode和UTF-8
- 匈牙利算法水题(HDU2063)
- 网络安全法首案 四川一家网站因高危漏洞遭入侵被罚
- Redis--pub/sub(发布与订阅)
- 齐博cms 7.0 漏洞分析
- PHP7(一):数据库操作(连接、增删改查操作)
- 2017多校-8
- js手写手风琴菜单
- 组建敏捷团队的几点想法
- [Sass]混合宏 VS 继承 VS 占位符
- 超全的Python学习路线图
- 梯度下降法的简单理解(含示例)