介绍
Redis中的订阅、发布实现了发布/订阅消息范式,发布者不是计划发送消息给特定的订阅者,而是发布消息到不同的频道,发布者不需要知道是哪些订阅者订阅了消息。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道是什么样的发布者发布的消息。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。
在Redis的发布订阅模式中,有三个部分:
发布订阅的命令如下:
#发布消息到指定的频道
PUBLISH channel message
#订阅给定的一个或多个频道的信息
SUBSCRIBE channel [channel ...]
#订阅一个或多个符合给定模式的频道
PSUBSCRIBE pattern [pattern ...]
#指退订给定的频道
UNSUBSCRIBE [channel [channel ...]]
#退订所有给定模式的频道
PUNSUBSCRIBE [pattern [pattern ...]]
#查看订阅与发布系统状态
PUBSUB subcommand [argument [argument ...]]
我们使用上篇文章中搭建的集群来测试Redis的订阅发布模式,A节点作为发布者,A,B,C节点作为订阅者消费A节点发布的消息:
订阅者6381:与发布者在同一节点,订阅www,csdn,wyk三个频道;
订阅者6382:订阅符合csdn*和wyk*模式的所有频道;
订阅者6383:订阅csdn频道;
发布者6381:分别往csdn1,csdn2,csdn,wyk四个频道发送消息,验证三个订阅者接收消息的情况以及发布者发布消息后的返回值;
断开后的订阅者重新订阅后会丢失断开期间发布者发布的消息:
在集群模式中,发布者发布消息后的返回值取决于订阅者与发布者在不在同一个节点上:
发布者发布消息后返回值为与发布者相同节点当前订阅了该频道的客户端数量。
对比
在上面的示例中,大家也可以看到,Redis中的发布订阅非常像消息队列,但还是有不同,我们就来对比一下Redis的List实现消息队列以及传统消息队列Kafka看看有哪些不同:
对比List
与Redis中的List对比,基于List实现的消息队列需要结合lpush + brpop来实现。
对比Kafka
Redis的发布订阅以及List并不是要和专业的消息队列对标,而是可以实现类似的功能,真正在消息队列领域做的好的有很多,RabbitMQ,ActiveMQ,RocketMQ,Kafka,Pulsar等等,发布订阅相比于它们有什么异同呢?
不同点:
相同点: