Redis的“发布/订阅”
《左手MongoDB,右手Redis》
“发布/订阅”模式是 Redis 自带的一对多消息通信模式
(一)测试用例
1、发送端
import redis
import json
import datetime
client = redis.Redis()
while True:
message = input("请输入需要发布的信息")
now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
data = {"message": message, "time": now_time}
client = publish("pubinfo", json.dumps(data))
2、接收端
import redis
import json
client = redis.Redis()
listener = client.pubsub(ignore_subscribe_messages=True)
listener.subscribe("pubinfo")
for message in listener.listen():
data = json.loads(message["data"].decode())
print(f'接收到新消息:{data["message"]},发送时间为: {data["time"]}')
(二)“发布/订阅”相关命令
-
发布消息
- client.publish(’频道名’, ’消息’)
-
订阅频道
# listener.listen()是一个阻塞式的方法。程序运行到这里,如果频道里面没有数据,则程序就会“卡住”,直到频道里面有了新的信息,才会继续运行后面的代码。 listener = client.pubsub() listener.subscribe("pubinfo") for message in listener.listen(): print(message)
-
message是一个字典,它的内容有两种情况:
- 第1次进入for循环时,数据为:
- {'type': 'subscribe', 'pattern': None, 'channel': b'pubinfo', 'data': 1}
- 这条信息表明订阅频道“pubinfo”成功。
- 如果不想显示这一条内容,则在初始化“发布/订阅”对象时,可以指定一个参数:ignore_subscribe_messages=True。
- 从第2次循环开始就是正式的频道信息,格式为:
- {'type': 'message', 'pattern': None, 'channel': b'pubinfo', 'data': b'{"message":"yy", "time": "2018-08-19 13:38:58"}'}
- 发送端发送的信息,保存在字典的data这个Key对应的值里面,还是bytes型的数据,需要解码为字符串以后做进一步处理
- 第1次进入for循环时,数据为:
-
一个“发布/订阅”实例可以订阅多个频道,格式为:
- listener = client.pubsub()listener.subscribe(’频道名1', ’频道名2', ’频道名n')
- 订阅是通过message["channel"]判断不同频道信息
-
注意事项
- “发布/订阅”模式的工作过程就像收音机的广播一样,只有调到了这个频道,才能收到信息,而之前的信息就都丢失了