发布与订阅
提示
发布与订阅(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')
发布/订阅
模式的两个缺点:
- 如果客户端订阅了某些频道,但是它的消费速度不够快,带来的消息堆积会导致Redis速度变慢
- 数据的可靠性问题,如果出现网络断开的情况,消息的丢失如何处理的问题。