Redis消息发布订阅

2022-05-05 16:37:15 浏览数 (1)

发布订阅

谈到「Redis」你可能会想到用作缓存,然而「Redis」除了做缓存还有很多功能。比如做分布式锁,生成全局的「ID」,可以做延迟队列。除了这些「Redis」还可以做消息的发布订阅。

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

「Redis」 客户端可以订阅任意数量的频道。

如果你不知道什么是发布订阅,请看下面维基百科的解释:

❝在软件架构中,「发布」-「订阅」是一种消息范式,消息的发送者(称为「发布」者)不会将消息直接发送给特定的接收者(称为「订阅」者)。而是将「发布」的消息分为不同的类别,无需了解哪些「订阅」者(如果有的话)可能存在。同样的,「订阅」者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些「发布」者(如果有的话)存在。 ❞

Redis订阅消息

「Redis」的发布订阅系统有点类似于我们生活中的电台,电台可以在某一个频率上发送广播,而我们可以接收任何一个频率的广播,这种消息订阅没有「Kafka」高效。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

图片来源:https://www.redis.net.cn/tutorial/3514.html

当有新消息通过 「PUBLISH」 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

图片来源:https://www.redis.net.cn/tutorial/3514.html

订阅消息的方式如下:

代码语言:javascript复制
127.0.0.1:12001> SUBSCRIBE c1 c2 c3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "c1"
3) (integer) 1
1) "subscribe"
2) "c2"
3) (integer) 2
1) "subscribe"
2) "c3"
3) (integer) 3

这个表示接收「c1,c2,c3」三个频道传来的消息,发送消息的方式如下:

代码语言:javascript复制
127.0.0.1:12001> PUBLISH c1 "I am lvshen"
(integer) 1

「c1」这个频道上有消息发出时,此时在消息订阅控制台可以看到如下输出:

代码语言:javascript复制
1) "message"
2) "c1"
3) "I am lvshen"

「Redis」中,我们也可以使用模式匹配订阅,如下:

代码语言:javascript复制
127.0.0.1:12001> PSUBSCRIBE c* 
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1

此时可以接收到所有以「c」开头的频道发来的消息。

创建「c1」频道

另一边在这个频道上发布一个消息

这里接收到我发布的消息。

关于发布订阅的问题

有人可能会说,有了「Redis」发布订阅,是不是就可以取代「Kafka」的发布订阅了呢。当然不能,「Kafka」的发布订阅能处理海量数据,而「Redis」不能。而且当「Redis」消费端取消订阅,数据就会消失。不能持久化。

0 人点赞