04给女朋友讲讲Redis-发布订阅

一、Redis发布订阅介绍

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

Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
当有新消息通过 PUBLISH 命令发送给Redis Server时, 这个消息就会被发送给订阅它的三个客户端。


image.png

主要命令:

  • PUBLISH 发布消息
  • SUBSCRIBE 订阅给定的一个或多个频道的信息
  • PSUBSCRIBE 订阅一个或多个符合给定模式的频道
  • UNSUBSCRIBE 退订一个或多个频道的信息

二、发布/订阅的使用

Redis有两种发布订阅模式:

  • 基于频道(channel)的发布订阅
  • 基于模式(pattern)的发布订阅

1.基于频道(channel)
底层是通过字典实现的,这个字典就用于保存订阅频道的信息:字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。

  • 订阅者订阅消息
127.0.0.1:6379> SUBSCRIBE channelA
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channelA"
3) (integer) 1
  • 发布者发布消息
127.0.0.1:6379> PUBLISH channelA hello,world
(integer) 1

订阅者接收到消息

127.0.0.1:6379> SUBSCRIBE channelA
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channelA"
3) (integer) 1
# 订阅者接收到的消息
1) "message"
2) "channelA"
3) "hello,world"

2.基于模式(pattern)
如果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会收到信息。
消息订阅者

127.0.0.1:6379> PSUBSCRIBE luoji.*

消息发送者A发送消息

127.0.0.1:6379> PUBLISH luoji.g403 g403
(integer) 1

消息发送者B发送消息

127.0.0.1:6379> PUBLISH luoji.gpw gpw
(integer) 1

消息订阅者分别收到两个频道的消息

Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "luoji.*"
3) (integer) 1
1) "pmessage"
2) "luoji.*"
3) "luoji.g403"
4) "g403"
1) "pmessage"
2) "luoji.*"
3) "luoji.gpw"
4) "gpw"

三、深入理解

  • 数据结构
    比如说,在下图展示的这个 pubsub_channels 示例中, client2 、 client5 和 client1 就订阅了 channel1 , 而其他频道也分别被别的客户端所订阅:
    image.png
  • 订阅

当客户端调用 SUBSCRIBE 命令时, 程序就将客户端和要订阅的频道在 pubsub_channels 字典中关联起来。

举个例子,如果客户端 client10086 执行命令 SUBSCRIBE channel1 channel2 channel3 ,那么前面展示的 pubsub_channels 将变成下面这个样子:

image.png

  • 发布

当调用 PUBLISH channel message 命令, 程序首先根据 channel 定位到字典的键, 然后将信息发送给字典值链表中的所有客户端。

比如说,对于以下这个 pubsub_channels 实例, 如果某个客户端执行命令 PUBLISH channel1 "hello moto" ,那么 client2 、 client5 和 client1 三个客户端都将接收到 "hello moto" 信息。

  • 退订

使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作: 它从 pubsub_channels 字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容