Redis的“发布/订阅”

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型的数据,需要解码为字符串以后做进一步处理
    • 一个“发布/订阅”实例可以订阅多个频道,格式为:

      • listener = client.pubsub()listener.subscribe(’频道名1', ’频道名2', ’频道名n')
      • 订阅是通过message["channel"]判断不同频道信息
  • 注意事项

    • “发布/订阅”模式的工作过程就像收音机的广播一样,只有调到了这个频道,才能收到信息,而之前的信息就都丢失了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容