欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【redis】-- redis的发布订阅

程序员文章站 2022-03-04 19:58:40
...


redis的发布订阅功能由PSUBSCRIBE、PUBLISH、PUBSUB、PUNSUBSCRIBE、SUBSCRIBE、UNSUBSCRIBE命令实现。

在redis中发布订阅的实现非常简单通过一行命令就能实现发布或订阅功能,在redis中由两种订阅类型,一个是频道订阅,只订阅某一个频道。还有一个是模式订阅,通过对channel的模式匹配来订阅多个频道。

无论是频道的订阅还是模式的订阅,其订阅的频道都是由PUBLISH命令来发布的。

  • publist :将信息 message 发送到指定的频道 channel。返回值:integer-reply: 收到消息的客户端数量
PUBLISH channel message

下面我们来讲一下这两种订阅模式。

1.频道的订阅与退订

频道的订阅和退订是由SUBSCRIBE、UNSUBSCRIBE命令实现两个命令实现。

如A,B,C三个客户端都订阅news.it频道

subscribe news.it

【redis】-- redis的发布订阅

那么,在订阅之后这三个客户端就可以看到news.it频道上发生的消息。此时如果

publist news.it hello

那么A,B,C都会收到该信息。
【redis】-- redis的发布订阅

如果对频道发送的信息不感兴趣,想要退订,那么使用

unsubscribe news.it

redis的发布订阅功能,其底层是通过一个链数组来实现的。每一个频道都放到数组中,如果有客户端订阅该频道就把该客户端挂在,对应节点的后面;
【redis】-- redis的发布订阅

如果在订阅时,被订阅的节点还不存在,那么redis就会在新开出一个频道节点放在数组的尾部,然后把订阅该频道的客户端,挂在新建节点的后面。

如上面没有news.movie频道那么

subscribe news.movie news.sport

其实现就为
【redis】-- redis的发布订阅

,在退订时就把对应的节点从频道对应的链表中删掉就好了。如果每次退订后,频道后的链表边为空,就会把其删掉。

unsubscribe news.movie news.sport

【redis】-- redis的发布订阅

2.模式的订阅与退订

模式的订阅与退订,和频道的订阅其实相差不大,就是模式会一次订阅对应模式的所有频道。

模式的订阅和退订是通过psubscribe和punsubscribe来实现

如订阅一个模式

psubscribe news.*

就会订阅所以名称含有news.的频道
【redis】-- redis的发布订阅

当频道发信息时,只要是与模式相同的频道的信息都会发给订阅该模式的客户端。

模式的退订和订阅类似,就不赘述;

在redis中模式订阅与频道订阅不同。模式订阅被放在一个链表中,链表节点存储了订阅模式的客户端和被订阅的模式。

【redis】-- redis的发布订阅

故模式的订阅和退订就是对链表的添加和删除。

3.查看订阅信息

pubsub可查看频道相关信息

PUBSUB CHANNELS [pattern]

列出当前active channels.活跃是指信道含有一个或多个订阅者(不包括从模式接收订阅的客户端) 如果pattern未提供,所有的信道都被列出,否则只列出匹配上指定全局-类型模式的信道被列出.

127.0.0.1:6379> PUBSUB channels
1) "a2"
2) "a1"

PUBSUB NUMSUB [channel-1 … channel-N]

列出指定信道的订阅者个数(不包括订阅模式的客户端订阅者)(个数应该是测量了,频道后面链表的长度,而模式订阅者不在该链表中所以会被排除在外)

127.0.0.1:6379> PUBSUB numsub a1
1) "a1"
2) (integer) 1

返回值
array-reply: 信道的列表和每个列表中订阅者的个数. 格式为 信道,个数,信道,个数,… 简单的列表.

注意,不给定任何频道而直接调用这个命令也是可以的, 在这种情况下,命令只返回一个空列表.

PUBSUB NUMPAT

返回订阅模式的数量(使用命令PSUBSCRIBE实现).注意, 这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和。

integer-reply: 客户端订阅的所有模式的数量总和

127.0.0.1:6379> PUBSUB numpat
(integer) 1

只有一个模式在redis的库中。

相关标签: redis