redis 发布与订阅

Jackey Redis 2,487 次浏览 , 没有评论

发布与订阅功能

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

订阅频道

SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道。
复杂度为 O(N) , N 为被订阅频道的数量。
redis> SUBSCRIBE news::it
Reading messages... (press Ctrl-C to quit)
1) "subscribe" # 订阅频道时返回的消息
2) "news::it" # 被订阅的频道
3) (integer) 1 # 客户端目前订阅频道的数量

1) "message" # 这是从频道接收到的消息
2) "news::it" # 消息来源的频道
3) "hello" # 消息内容

订阅模式

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 等频道;
诸如此类。

redis> PSUBSCRIBE news::[ie]t
Reading messages... (press Ctrl-C to quit)
1) "psubscribe" # 订阅模式时返回的信息
2) "news::[ie]t" # 被订阅的模式
3) (integer) 1 # 客户端目前订阅的模式数量

1) "pmessage" # 这是从模式接收到的消息
2) "news::[ie]t" # 被匹配的模式
3) "news::it" # 消息的来源频道(被匹配的频道)
4) "hello" # 消息正文

1) "pmessage"
2) "news::[ie]t"
3) "news::et"
4) "world"

退订频道和退订模式

UNSUBSCRIBE [channel [channel ...]]

退订指定的频道。
如果执行时没有指定任何频道,那么退订已订阅的所有频道。

PUNSUBSCRIBE [pattern [pattern ...]]

退订指定的模式。
如果执行时没有指定任何模式,那么退订已订阅的所有模式。

退订命令的行为在各个客户端的表现都不同,比如 redis-cli 客户端就是通过直接退出客户端来进行退订的,而 Python 和 Ruby 的客户端则需要显示地执行退订命令。

发布消息

PUBLISH channel message
将消息发送至指定的频道,命令返回接收到消息的 订阅者数量。
复杂度为 O(N) ,N 为接收到消息的订阅者数量(包括通过订阅频道来接收消息的订阅者和通过订阅模式来接收消息的订阅者)。
redis> PUBLISH news::it "hello world"
(integer) 2
redis> PUBLISH news::et "hello again"
(integer) 1

查看被订阅的频道

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 # 服务器目前有三个模式被订阅

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Go