4.3 发布订阅
我们在字符类型那部分已经探讨过Redis简易的消息队列(点对点,后面有解释和对比)。这里则是高级点的实现。
对于有接触过发布订阅模型(生产者消费者模型)的消息队列的朋友来说,这部分是Soeasy的。
发布订阅模型分成三个角色: 1. 发布者(publisher) 2. 订阅者(subscriber) 3. 频道(channel)
它们的关系如下:
- 每个订阅者可以订阅多个频道
- 发布者发布消息后,订阅者就可以收到不同频道的消息
- 订阅者不可以接收未订阅频道的消息
- 订阅者订阅某个频道后,Redis无法做消息的堆积,不能接收频道被订阅之前发布的消息
Redis server就相当于频道
发布者是一个redis-cli,通过redis server发布消息
订阅者也是于一个redis-cli,如果订阅了这个频道,就可以通过redis server获取消息
发布订阅的命令
publish channel message 发布消息 subscribe [channel] 订阅频道 unsubscribe [channel] 取消订阅 psubscribe [pattern...] 订阅指定模式的频道 punsubscribe [pattern...] 退订指定模式的频道 pubsub channels 列出至少有一个订阅者的频道 pubsub numsub [channel...] 列表给定频道的订阅者数量 pubsub numpat 列表被订阅模式的数量
打开一个终端1
127.0.0.1:6379> subscribe sohu_tv # 订阅sohu_tv频道 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "sohu_tv" 3) (integer) 1
打开一个终端2
127.0.0.1:6379> publish sohu_tv 'hello python' # sohu_tv频道发布消息 (integer) 1 127.0.0.1:6379> publish sohu_tv 'hello world' # sohu_tv频道发布消息 (integer) 3
可以看到终端1中已经接收到sohu_tv发布的消息
127.0.0.1:6379> subscribe sohu_tv Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "sohu_tv" 3) (integer) 1 1) "message" 2) "sohu_tv" 3) "hello python" 1) "message" 2) "sohu_tv" 3) "hello world"
打开终端3,取消订阅sohu_tc频道
127.0.0.1:6379> unsubscribe sohu_tv 1) "unsubscribe" 2) "sohu_tv" 3) (integer) 0
消息队列点对点与发布订阅区别¶
- 1.点对点
消息生产者消息发送到queue中,然后消费者从queue中取。
注意:消息被消费以后,队列中不再有存储。客户端和客户端之间是抢的关系。生产者发送一条消息到queue,只有一个消费者能收到。
- 2.发布/订阅
生产者将消息发送到topic中,同时多个消费者消费这个消息。和点对点不同,发布到topic的消息会被所有订阅者消费。
版权声明:
本文为智客工坊「沉晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。