九Redis 发布与订阅

发布与订阅功能
Redis 的发布与订阅功能可以让用户将消息同时发送给多个客户端。 这个功能由几个不同的角色 协作组成:
• 发布者(publisher):发布消息的客户端。
• 频道(channel):构建在服务器内部,负责接收发布者发送的消息,并将消息 转发给频道的订阅者。
• 模式(pattern):构建在服务器内部,负责对频道进行匹配,当被匹配的 频道接到消息时,模式也会
将消息转发给模式的订阅者。
订阅者(subscriber):通过订阅频道或者模式来获取消息的客户端。每个频道或者模式都可以有任意多个订阅者

频道的订阅与消息发布
B, C 、 D 三个客户端正在订阅 news::it 频道
当客户端 A 向 news::it 频道发送消息 “hello world” 时,该消息将被频道转发至 B 、 C 、 D 三 个客户端

模式的订阅与消息发布
客户端 C 和 D 订阅了 news::[ie]t 模式,而这个模式又和 news::it 、 news::et 两个频道匹配,当 news:: it 频道或者 news::et 频道接收到消息的时候,这些消息不仅会被转发给频道的订阅者,也会被转发给 客户端 C 和 D

模式订阅者接收消息示例(1)

模式订阅者接收消息示例(2)

订阅命令与发布
订阅频道或模式、退 订频道或模式、 发布消息。

订阅频道
SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道
复杂度为 O(N) , N 为被订阅频道的数量

订阅模式
PSUBSCRIBE pattern [pattern ...]
订阅一个或多个模式, pattern 参数可以包含 glob 风格的匹配符,比如:
• news::* 模式可以匹配 news::bussiness 、 news::it 、 news::sports::football 等频道;
• news::[ie]t 模式可以匹配 news::it 频道或者 news::et 频道;
• news::?t 模式可以匹配 news::it 、 news::et 、 news::at 等频道;
诸如此类
复杂度为 O(N) ,N 为被订阅模式的数量。
订阅模式示例

订频道和退订模式

退订命令的行为在各个客户端的表现都不同,比如 redis-cli 客户端就是通过直接退出客户端来进行退订 的,而 Python 和 Ruby 的客户端则需要显示地执行退订命令。
退订示例
发布消息
PUBLISH channel message
将消息发送至指定的频道,命令返回接收到消息的 订阅者数量。
复杂度为 O(N) ,N 为接收到消息的订阅者数量(包括通过订阅频道来接收消息的订阅者和通过订阅模
式来接收消息的 订阅者)

订阅状态命令
查看被订阅的频道、频道的订阅数量以及模式的订阅数量。


查看被订阅的频道 PUBSUB CHANNELS [pattern]
列出目前至少有一个 订阅者的频道。
如果给定了可选的 pattern 参数,那么只列出与模式相匹配的频道。
复杂度为 O(N) ,N 为服务器中被订阅频道的总数量。
redis > PUBSUB CHANNELS #没有任何频道被订阅
(empty list or set)
redis > PUBSUB CHANNELS #有客户端正在订阅 news::et和news::it频道
1) "news::et"
2) "news::it"
查看频道的订阅者数量
PUBSUB NUMSUB [channel-1 ... channel-N]
返回给定频道的订阅者数量。
复杂度为 O(N) ,N 为给定频道的数量。
redis> PUBSUB NUMSUB news::it news::et
1) "news::it" #有两个客户端正在订阅news::it频道
2) "2"
3) "news::et" #有一个客户端正在订阅news::et频道
4) "1"
查看被订阅模式的数量
PUBSUB NUMPAT
返回服务器目前被订阅的模式数量
复杂度为 O(1)
redis> PUBSUB NUMPAT
(integer) 3 # 服务器目前有三个模式被订阅
使用发布与订阅功能实现直播间
要使用 Redis 实现类似的直播间,我们可以 为每个直播间设置一个频道,每个直播间的 听众都是频道的订阅者,而播主则通过向频 道发送消息来告 诉大家要播放哪首歌。
比如说,假设用户 peter 正在进行直播,他的 直播间的频道为 peter::live::room ,当 peter 要播放 ID 为 10086 的歌曲时,他会执行命 令 PUBLISH peter::live::room “play_song:: 10086” 。
而所有听众在接收到 这条消息时,只需要分 析出里面的指令( play_song)和要播放的歌 曲 ID (10086),就可以播放 peter 指定的歌 曲了。

直播间的播主示例
>>> from live_room import LiveRoom
>>> live = LiveRoom(client, "peter::live::room") # 指定直播间 >>> live.play(10086) # 播放 id 为 10086 的歌曲
playing song, id = 10086
>>> live.play(12345) # 播放 id 为 12345 的歌曲
playing song, id = 12345

直播间的听众示例
>>> from live_room import LiveRoom
>>> live = LiveRoom(client, "peter::live::room") # 指定直播间 >>> live.listen() # 开始收听 peter 的直播间
playing song, id = 10086 # 播主播放了 id 为 10086 的歌曲 playing song, id = 12345 # 播主播放了 id 为 12345 的歌曲


扫描二维码关注公众号,回复: 4660161 查看本文章

猜你喜欢

转载自blog.csdn.net/xsjzdrxsjzdr/article/details/85248350
今日推荐