【redis】-- redis的发布订阅


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

图片

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

publist news.it hello

那么A,B,C都会收到该信息。
图片

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

unsubscribe news.it

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

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

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

subscribe news.movie news.sport

其实现就为
图片

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

unsubscribe news.movie news.sport

图片

2.模式的订阅与退订

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

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

如订阅一个模式

psubscribe news.*

就会订阅所以名称含有news.的频道
图片

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

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

在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的库中。

原文地址:https://www.cnblogs.com/wf614/p/12919818.html