Redis(十六)——发布订阅

Redis的发布订阅功能用于实现消息通信,发送者通过PUBLISH命令将消息发送到频道,订阅者通过SUBSCRIBE或PSUBSCRIBE命令接收消息。消息发布与订阅的关系存储在服务器状态的pubsub_channels和pubsub_patterns中。常见应用场景包括实时聊天、实时消息系统等。

Redis(十六)——发布订阅

1、发布订阅概述

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

Redis 客户端可以订阅任意数量的频道。、

订阅发布消息图:

在这里插入图片描述

发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端), 而是将信息发送给频道(channel), 然后由频道将信息转发给所有对这个频道感兴趣的订阅者。

发送者无须知道任何关于订阅者的信息, 而订阅者也无须知道是那个客户端给它发送信息, 它只要关注自己感兴趣的频道即可。

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

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

img

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

img

常用命令

下表列出了 redis 发布订阅常用命令:

序号命令及描述
1PSUBSCRIBE pattern [pattern …] 订阅一个或多个符合给定模式的频道。
2PUBSUB subcommand [argument [argument …] 查看订阅与发布系统状态。
3PUBLISH channel message将信息发送到指定的频道。
4PUNSUBSCRIBE pattern [pattern …] 退订所有给定模式的频道。
5SUBSCRIBE channel [channel …]订阅给定的一个或多个频道的信息。
6UNSUBSCRIBE channel [channel …] 指订指定的频道。

Psubscribe 命令

Redis Psubscribe 命令订阅一个或多个符合给定模式的频道。

每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)。 news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。

返回值:接收到的信息。

UNSUBSCRIBE 命令

UNSUBSCRIBE 命令不加参数时表示退订所有频道。

发布订阅测试

1、订阅者订阅一个频道,订阅后会自动监听该频道

127.0.0.1:6379> subscribe game
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "game"
3) (integer) 1

2、发送者往这个频道里面发送消息

127.0.0.1:6379> publish game wangzherongyao
(integer) 1
127.0.0.1:6379> publish game chiji
(integer) 1

3、订阅者接收消息

127.0.0.1:6379> subscribe game
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "game"
3) (integer) 1
1) "message"
2) "game"  #消息来自哪个频道
3) "wangzherongyao"  #消息内容
1) "message"
2) "game"
3) "chiji"

4、再开一个客户端,订阅者订阅一个频道模式

127.0.0.1:6379> PSUBSCRIBE cctv.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "cctv.*"
3) (integer) 1

5、发送者往频道里发送消息

127.0.0.1:6379> publish cctv.1 xinwen
(integer) 1
127.0.0.1:6379> publish cctv.5 tiyu
(integer) 1

6、订阅者接收消息,只要是符合 cctv.* 这种格式,都可以收到

127.0.0.1:6379> PSUBSCRIBE cctv.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "cctv.*"
3) (integer) 1
1) "pmessage"
2) "cctv.*"
3) "cctv.1"
4) "xinwen"
1) "pmessage"
2) "cctv.*"
3) "cctv.5"
4) "tiyu"

2、发布订阅原理

SUBSCRIBE频道订阅原理

当一个客户端执行SUBSCRIBE命令订阅某个或某些频道的时候,这个客户端与被订阅频道之间就建立了一种订阅关系。

Redis 将所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里面,这个字典的键(key)是某个被订阅的频道,值(value)是一个链表,链表里面记录了所有订阅这个频道的客户端。

在这里插入图片描述

PSUBSCRIBE订阅模式原理

服务器将所有的订阅关系都保存在服务器状态的 pubsub_channe 属性里面,在模式订阅里服务器也将所有模式的订阅关系都保存在服务器状态的pubsub_patterns属性里面。

pubsub_patterns属性是一个链表,链表中的每个节点都包含着一个pubsubPattern结构,这个结构的pattern属性记录了被订阅的模式,而client属性则记录了订阅模式的客户端。

pubsub_patterns 属性示例:

在这里插入图片描述

这个链表记录了以下信息:

  • 客户端client-7正在订阅模式 cctv.*
  • 客户端client-8正在订阅模式 test_x.*
  • 客户端client-9正在订阅模式 test.y*"

当客户端执行PSUBSCRIBE命令订阅某个或某些模式的时候,服务器会对每个被订阅的模式执行以下两个操作:

  1. 新建一个pubsubPattern结构,将结构的pattern属性设置为被订阅的模式(如: cctv.*),client属性值设置为订阅模式的客户端。
  2. 将pubsubPattern结构添加到pubsub_patterns链表的表尾。

PUBLISH 消息发布原理

当客户端通过PUBLISH命令向某个频道发送消息时,Redis首先在结构体redisServer中的pubsub_channels字典中找出键(key)为该频道的结点,遍历该结点的值,找出所有的客户端,将消息发送给这些客户端。

然后,遍历结构体redisServer中的pubsub_patterns,找出包含该频道的模式的结点,将消息发送给订阅了该模式的客户端。

3、使用场景

1、实时聊天(聊天室当做频道,订阅者发消息给发送者,发送者再把消息回显给所有人)

2、实时消息系统

3、订阅、关注系统。。。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里顾—程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值