Skip to content

发布与订阅

提示

发布与订阅(pub/sub)的特点是订阅者(subscribe)负责订阅频道(channel)发布者(publisher)负责向频道中发送二进制字符串消息。

命令作用
SUBSCRIBE [ channel ... ]订阅一个或多个频道
UNSUBSCRIBE [ channel ... ]退订一个或多个频道,不传频道就退订全部
PUBLISH <channel> <message>向给定频道发送消息
PSUBSCIBE [ pattern ...]订阅正则匹配的所有频道
PUNSUBSCRIBE []退订正则匹配的模式,不传默认退订全部
shell
# 订阅channel
$ SUBSCRIBE channel
1)  "subscribe"
2)  "channel"
3)  "1"
# 向频道发送消息
$ PUBLISH channel helloworld
 1)  "message"
 2)  "channel"
 3)  "helloworld"
python
def publish():
    # 用于连接时长
    time.sleep(2)
    for i in [1, 2, 3, 4, 5, 6]:
        connection.publish('channel', i)


def subscribe(conn):
    # 启动线程发送消息
    threading.Thread(target=publish, args=()).start()
    # 获取发布/订阅对象
    pub_sub = conn.pubsub()
    # 订阅频道,一开始会出现确认信息:data表示此频道被订阅数量
    # {'type': 'subscribe', 'pattern': None, 'channel': b'channel', 'data': 1}
    pub_sub.subscribe('channel')
    count = 0
    for item in pub_sub.listen():
        # {'type': 'message', 'pattern': None, 'channel': b'channel', 'data': b'1'}
        print(item)
        count += 1
        if count == 5:
         # 取消订阅也会出现信息:data表示此频道被订阅数量
         #{'type': 'unsubscribe', 'pattern': None, 'channel': b'channel', 'data': 0}
            pub_sub.unsubscribe('channel')

发布/订阅模式的两个缺点:

  1. 如果客户端订阅了某些频道,但是它的消费速度不够快,带来的消息堆积会导致Redis速度变慢
  2. 数据的可靠性问题,如果出现网络断开的情况,消息的丢失如何处理的问题。