版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zx711166/article/details/82844561
发布订阅
角色
- 发布者(publisher)
- 订阅者(subscriber)
- 频道(channel)
通讯模型
对于发布者(publisher)来说其实是一个客户端,对于订阅者(subscriber)来说也是一个客户端,在Redis server里面是有一个频道;发布者发布一条hello的消息,订阅者订阅了频道,每个订阅了该频道的订阅者都能收到这条消息。
其实类似于下面这种生产\消费模型,生产者生产到一个队列(频道、通道)中,消费者订阅这个队列(频道、通道),就可以获取这些信息。
消费者可以订阅到多个频道;新的订阅者无法收到历史消息,无法做到消息堆积,因为Redis不是做一个真正的消息队列而去发布订阅的专用工具,只是提供了一个这样的功能。
发布订阅命令
publish(发布)
- publish channel message:将信息 message 发送到指定的频道 channel 。
- 时间复杂度:O(N+M),其中 N 是频道 channel 的订阅者数量,而 M 则是使用模式订阅(subscribed patterns)的客户端的数量。
#有订阅者,返回订阅者个数
redis> publish sohu:tv "hello world"
(integer) 3
#无订阅者,返回0
redis> publish sohu:auto "taxi"
(integer) 0
subscribe (订阅)
- subscribe [channel]:订阅一个或多个频道。
- 时间复杂度:O(N),其中 N 是订阅的频道的数量。
#订阅了频道能收到频道发送的消息
redis> subscribe suhu:tv
1) "subscribe" # 返回值的类型:显示订阅成功
2) "suhu:tv" # 订阅的频道名字
3) (integer) 1 # 目前已订阅的频道数量
1) "message" # 返回值的类型:信息
2) "suhu:tv" # 来源(从那个频道发送过来)
3) "hello world" # 信息内容
unsubscribe(取消订阅)
- unsubscribe [channel]:取消订阅一个或者多个频道。
- 时间复杂度:O(N) , N 是客户端已订阅的频道的数量。
redis> unsubscribe sohu:tv
1) "unsubscribe"
2) "sohu:tv"
3) (integer) 0
消息队列
消息队列发布消息后,只有一个订阅者能获取到这条信息。使用list(列表)来实现,使用阻塞的方式去拉取数据。
发布订阅总结
- 发布订阅模式中的角色
- API的使用
- 发布订阅和消息队列的使用场景的区别