发布订阅
谈到「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」消费端取消订阅,数据就会消失。不能持久化。