Redis | Redis Pub/Sub相关命令

时间:2022-07-26
本文章向大家介绍Redis | Redis Pub/Sub相关命令,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Redis 不但支持多种数据类型,能满足很多的业务场景,而且 Redis 还支持类似 Pub/Sub (发布与订阅) 这样的高级功能。如下图。

上图中用红色圈中的部分,就是关于 发布与订阅 相关的命令。如果想要在 Redis 中查看相关的命令可以使用 help 命令来进行查看,命令如下:

127.0.0.1:6379> help @pubsub

按下回车后,可以看到 发布与订阅 相关命令的说明,如下图。

上图中就是 Redis 中关于 发布与订阅 的全部命令。

发布与订阅的关系

发布与订阅之间的关系是,订阅者通过订阅指定的频道来接收发布者发布的消息,发布与订阅的示意图如下所示。

常用的 发布与订阅 相关命令

这里只介绍四个 发布与订阅 相关的命令,其他两个暂时没有找到使用的场景。

1、subscribe

该命令的作用是:订阅者订阅指定的一个或多个频道,用来接收该频道推送来的消息。

打开两个控制台窗口,分别订阅不同的频道,在第一个控制台中订阅 news.health 频道。

127.0.0.1:6379> subscribe news.health
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.health"
3) (integer) 1

在另外一个控制台中订阅 news.health 和 news.it 两个频道。

127.0.0.1:6379> subscribe news.health news.it
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.health"
3) (integer) 1
1) "subscribe"
2) "news.it"
3) (integer) 2

上面就是通过 subscribe 分别订阅一个和两个不同的频道。使用 subscribe 命令订阅频道后,命令行会进行阻塞等待频道中消息的到来。

2、publish

该命令的作用是:发布者针对指定的频道发布消息该命令一次只可以针对一个频道发布消息。

前面的控制台别进行操作,再新打开一个 Redis 的命令行控制台,然后针对 news.it 和 news.health 两个频道分别发布消息。

使用 publish 命令向 news.health 发布消息,命令如下:

127.0.0.1:6379> publish news.health "hello news.health"
(integer) 2

上面执行 publish 命令后,返回值为 2,表示消息发布给了该频道的两个订阅者。回到该频道的一个订阅者的窗口查看它对消息的接收情况。

1) "message"
2) "news.health"
3) "hello news.health"

这三行就是订阅者接收到频道发布消息后输出的内容,三行输出表示收到了一个消息(message),消息来自的频道(news.health),消息的内容(hello news.health)。每次接收到的消息都是紧挨在一起的,但是它会通过序号进行标识,因此在查看每次接收消息的时候还是比较方便的。

再向 news.it 发布一个消息,命令如下:

127.0.0.1:6379> publish news.it "hello news.it"
(integer) 1

从上面的 publish 命令可以看出,news.it 的订阅者只有一个订阅者,因此返回值是 1。这次截图来看一下,订阅 news.it 频道的订阅者接收消息后的输出,截图如下:

从图中可以看出,所有的输出都是紧挨在一起的,但是每次接收到消息后的输出的序号都是从 1 开始的,这样还算是比较容易阅读的。图中第一个序号 1 和 第二个序号 1 后面都跟着 “subscribe”,表示这两个输出是在订阅频道后的输出第三个序号 1 和 第四个序号 1 后面跟着的是 “message”,表示是收到消息后的所产生的输出

3、psubscribe

该命令的作用是:按照指定的模式订阅相关的频道

为了进行测试,再打开一个 Redis 的命令行控制窗口,订阅一个 news.dt 的频道。

127.0.0.1:6379> subscribe news.dt
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.dt"
3) (integer) 1

还需要打开一个 Redis 的命令行控制台窗口,按模式订阅一个 news.[id]t 的频道。

127.0.0.1:6379> psubscribe news.[id]t
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.[id]t"
3) (integer) 1

通过 publish 命令对 news.it 频道发送消息,然后查看接收到消息的频道。

127.0.0.1:6379> publish news.it "news.it"
(integer) 2

从 publish 的返回值可以看出有两个频道接收到了消息,实际订阅 news.it 的是一个,另外一个就是通过模式 news.[id]t 来进行订阅的。查看 news.[id]t 的订阅者接收消息的输出。

1) "pmessage"
2) "news.[id]t"
3) "news.it"
4) "news.it"

查看 news.it 接收到消息的输出。

1) "message"
2) "news.it"
3) "news.it"

从上面的输出可以看出,以普通方式订阅的 news.it 的订阅者输出是 3 行,通过 news.[id]t 模式订阅的输出是 4 行,第一行是模式消息(pmessage)、第二行是匹配的模式(news.[id]t)、第三行是消息来自的频道(news.it)、第四行是消息的内容(news.it)。

可以再通过 publish 命令向 news.dt 发送消息,观察通过模式订阅的 news.[id]t 的订阅者是否可以收到消息。

上面是第一种的模式订阅,再来看看第二种的模式订阅。再打开一个 Redis 的命令行窗口来进行测试,命令如下。

127.0.0.1:6379> psubscribe news.?t
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.?t"
3) (integer) 1

命令中的 ? 号代表一个单字符的通配符,它可以代表任意一个字符。然后,通过 publish 命令进行测试,测试命令如下。

127.0.0.1:6379> publish news.it "news.it 1"
(integer) 3
127.0.0.1:6379> publish news.dt "news.dt 1"
(integer) 3

我们来查看通过 ? 模式进行订阅的输出,输出如下;

1) "pmessage"
2) "news.?t"
3) "news.it"
4) "news.it 1"
1) "pmessage"
2) "news.?t"
3) "news.dt"
4) "news.dt 1"

可以看出,也可以收到针对 news.it 和 news.dt 频道发布的消息。当然,这还不算完,再来测试一种模式。

127.0.0.1:6379> psubscribe news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

* 号也是一种通配符,代表 0 到任意多个字符。使用 publish 进行测试,我们对 news 开头的所有频道进行消息发布,命令如下:

127.0.0.1:6379> publish news.it "hello every one"
(integer) 4
127.0.0.1:6379> publish news.dt "hello news.dt"
(integer) 4
127.0.0.1:6379> publish news.health "hello news.health"
(integer) 3

再来查看通过 * 号进行模式匹配的输出,输出如下;

1) "pmessage"
2) "news.*"
3) "news.it"
4) "hello every one"
1) "pmessage"
2) "news.*"
3) "news.dt"
4) "hello news.dt"
1) "pmessage"
2) "news.*"
3) "news.health"
4) "hello news.health"

从输出可以看出,对于发不到 news.it、news.dt、news.health 的消息都接收到了。

4、pubsub

该命令的作用是:查看关于频道相关的信息

channels:查看当前 Redis 系统中所有存在的频道,命令如下:

127.0.0.1:6379> pubsub channels
1) "news.dt"
2) "news.it"
3) "news.health"

numsub:查看指定频道的订阅数量,命令如下:

127.0.0.1:6379> pubsub numsub news.dt
1) "news.dt"
2) (integer) 1
127.0.0.1:6379> pubsub numsub news.it
1) "news.it"
2) (integer) 1
127.0.0.1:6379> pubsub numsub news.health
1) "news.health"
2) (integer) 2

numpat:查看通过模式进行订阅的数量,命令如下:

127.0.0.1:6379> pubsub numpat
(integer) 3

总结

发布与订阅的命令就介绍这么多了,看了上面的命令也不会觉得这些命令有多难,但是熟练的掌握命令和这些功能在真正写代码的时候速度会快很多。发布与订阅的功能有一个令人不太满意的地方,其不太满意的地方是 新加入频道的订阅者是收不到它加入之前的消息的,这点从实际当中来看,我个人觉得是说的过去的,就如同看电视、听广播,换台到当前频道后,该频道之前的电视剧情、或者广播内容,肯定是无法在接收到的。因此,如果想要持久化发布者发布到频道的消息,那么就无法直接使用 Pub/Sub 的功能了。