推荐两个网页:
https://zh.wikipedia.org/wiki/%E5%8F%91%E5%B8%83/%E8%AE%A2%E9%98%85
http://redis.cn/topics/pubsub.html
一、发布-订阅
在软件架构中,发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。
二、在cmd上运行
1、订阅:
# 打开cmd
# 运行redis:
redis-cli
# 订阅一个频道,格式为SUBSCRIBE channel:
# 举个例子:订阅kennyfm这个频道
SUBSCRIBE kennyfm
2、发布
# 打开另一个cmd操作窗口
# 启动redis
redis-cli
# 在一个频道上发布消息,格式为PUBLISH channel message
# 举个例子:在kennyfm频道上发布消息“this is a test”
PUBLISH kennyfm "this is a test"
三、在ipython上运行
1、订阅
创建pubsub对象,然后订阅sbscribe,再然后监听listen。注意listen到的信息是字节流
import redis
c2 = redis.StrictRedis()
s1 = c2.pubsub()
s1.subscribe("kennyfm")
s1.listen()
for m in s1.listen():
print(m)
2、发布
import redis
c1 = redis.Redis()
c1.publish("kennyfm", "kennyfm电台开播了")
四、Python代码实现
# 发布
# -*- coding:utf-8 -*-
# redis_pub.py
# Redis demo
# kenny
import redis
client = redis.Redis()
channels = ['jay', 'she', 'mj']
def main():
print("可以发布到任意一个频道")
for i in channels:
print(i)
ch = input("输入发送的频道>>>")
while True:
msg = input("输入发送的信息(q: 退出)>>>")
if msg == 'q':
break
else:
client.publish(ch, msg)
if __name__ == "__main__":
main()
# 订阅
# -*- coding:utf-8 -*-
# redis_sub.py
# Redis demo
# kenny
import redis
client = redis.StrictRedis()
channels = ['jay', 'she', 'mj']
# 得到pubsub对象
# 订阅频道
# listen监听
def subscribe():
s1 = client.pubsub()
s1.subscribe(channels)
s2 = client.pubsub()
s2.subscribe('she')
s3 = client.pubsub()
s3.subscribe(channels[:2])
show_msg(s1, 's1')
show_msg(s2, 's2')
show_msg(s3, 's3')
def show_msg(sub_obj, sub_name):
for msg in sub_obj.listen():
if msg["type"] == "message":
print(f"{sub_name} get message {msg['data'].decode()} from {msg['channel']}")
def main():
subscribe()
if __name__ == "__main__":
main()