4.3 发布订阅

  我们在字符类型那部分已经探讨过Redis简易的消息队列(点对点,后面有解释和对比)。这里则是高级点的实现。

  对于有接触过发布订阅模型(生产者消费者模型)的消息队列的朋友来说,这部分是Soeasy的。

  发布订阅模型分成三个角色: 1. 发布者(publisher) 2. 订阅者(subscriber) 3. 频道(channel)

  它们的关系如下:

  1. 每个订阅者可以订阅多个频道
  2. 发布者发布消息后,订阅者就可以收到不同频道的消息
  3. 订阅者不可以接收未订阅频道的消息
  4. 订阅者订阅某个频道后,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版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""