资讯专栏INFORMATION COLUMN

python开发-实现redis中的发布订阅功能

chengjianhua / 718人阅读

摘要:中的发布订阅模型是一种消息通信模式,今天聊一下在中实现简单的发布订阅功能。参考自链接描述以上就是发布订阅的简单实现,如有错误,欢迎交流指正

redis中的发布/订阅模型是一种消息通信模式,今天聊一下在python中实现简单的发布订阅功能。

实现方式一:
redis_helper.py: 封装发布订阅方法

import redis
                
                
class RedisHelper(object):
    
    def __init__(self):
        self.__conn = redis.Redis(host="localhost")
        # 订阅频道
        self.chan_sub = "fm104.5"
        
    def public(self, msg):
        """
        在指定频道上发布消息
        :param msg:
        :return:
        """
        # publish(): 在指定频道上发布消息,返回订阅者的数量
        self.__conn.publish(self.chan_sub, msg)
        return True

    def subscribe(self):
        # 返回发布订阅对象,通过这个对象你能1)订阅频道 2)监听频道中的消息
        pub = self.__conn.pubsub()
        # 订阅频道,与publish()中指定的频道一样。消息会发布到这个频道中
        pub.subscribe(self.chan_sub)
        ret = pub.parse_response()  # [b"subscribe", b"fm86", 1]
        print("ret:%s" % ret)
        return pub

redis_pub.py: 发布者

from redis_helper import RedisHelper
                
                
obj = RedisHelper()
for i in range(5):
    obj.public("hello_%s" % i)

redis_sub.py: 订阅者

from redis_helper import RedisHelper
                
                
obj = RedisHelper()
redis_sub = obj.subscribe()
while True:
    msg = redis_sub.parse_response()
    print(msg)

实现方式二:
redis_helper.py: 封装发布订阅方法

import redis
                
                
class RedisHelper(object):
    
    def __init__(self):
        self.__conn = redis.Redis(host="localhost")
        # 频道名称
        self.chan_sub = "orders"
        
    def public(self, msg):
        """
        在指定频道上发布消息
        :param msg:
        :return:
        """
        # publish(): 在指定频道上发布消息,返回订阅者的数量
        self.__conn.publish(self.chan_sub, msg)
        return True

    def subscribe(self):
        # 返回发布订阅对象,通过这个对象你能1)订阅频道 2)监听频道中的消息
        pub = self.__conn.pubsub()
        # 订阅某个频道,与publish()中指定的频道一样。消息会发布到这个频道中
        pub.subscribe(self.chan_sub)
        return pub

redis_pub.py:

from redis_helper import RedisHelper


obj = RedisHelper()
for i in range(5):
    obj.public("hello_%s" % i)

redis_sub.py:

from redis_helper import RedisHelper

obj = RedisHelper()
redis_sub = obj.subscribe()
while True:
    # listen()函数封装了parse_response()函数
    msg = redis_sub.listen()
    for i in msg:
        if i["type"] == "message":
            print(str(i["channel"], encoding="utf-8") + ":" + str(i["data"], encoding="utf-8"))
        elif i["type"] == "subscrube":
            print(str(i["chennel"], encoding="utf-8"))

以上两种方式的不同之处在于,方式一使用发布订阅对象的parse_response()方法获取订阅信息,方式二使用发布订阅对象的listen()方法获取订阅信息。listen()方法是对parse_response()方法的封装,加入了阻塞,并将parse_response()返回的结果进行了处理,使结果更加简单。

参考自 链接描述

以上就是发布/订阅的简单实现,如有错误,欢迎交流指正!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44917.html

相关文章

  • Python--Redis实战:第三章:Redis命令:第六节:发布订阅

    摘要:上一篇文章实战第三章命令第五节有序集合下一篇文章实战第三章命令第七节其他命令一般来说,发布与订阅又称的特点是订阅者负责订阅频道,发送者负责向频道发送二进制字符串消息。到目前为止,本书介绍的大多数命令都是与特定数据类型相关的。 上一篇文章:Python--Redis实战:第三章:Redis命令:第五节:有序集合下一篇文章:Python--Redis实战:第三章:Redis命令:第七节:其...

    DC_er 评论0 收藏0
  • Django WebSocket Redis 在线聊天室

    摘要:它采用了请求响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理弊端协议无法实现服务器主动向客户端发起消息。如何使用客户端创建对象属性表示连接状态可选值表示连接尚未建立。表示连接正在进行关闭。 一言不合就上效果图演示showImg(https://segmentfault.com/img/bVbkUDl?w=1920&h=638); 项目:http://112.74.164.1...

    ranwu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<