企业级Redis开发运维从入门到实践 (12)— 发布订阅

版权声明:本文为博主原创文章,未经博主允许不得转载。 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(列表)来实现,使用阻塞的方式去拉取数据。
在这里插入图片描述

发布订阅总结

  1. 发布订阅模式中的角色
  2. API的使用
  3. 发布订阅和消息队列的使用场景的区别

猜你喜欢

转载自blog.csdn.net/zx711166/article/details/82844561