python redis订阅_python redis模块消息发布和订阅

一、需求:

公司CICD平台前后端是分离的,后端用的是python,前端这块主要用的vue;中间有一个环节是将后端应用发布的结果信息通知给前端处理后展示在前端页面。早期的做法是以redis为媒介,将发布结果以广播的形式推送给redis,然后前端监听redis上对应频道的消息,接收到消息处理后发送给前端。

git地址:https://github.com/f1017746640/redisapi.git

二、代码逻辑部分:

2.1 代码结构:

2.2 config.ini为redis连接信息:

[DEFAULT]

redis_host=10.0.0.201

redis_port=30213

redis_db=6

redis_password=None

[LOCAL]

[DEV]

redis_host=10.0.0.201

redis_port=30213

redis_db=6

redis_password=

redis_channel=--deploy--

[QA]

[PROD]

2.3 rds.py 基于redis模块包装的消息发布和订阅的类:

#!/usr/bin/env python#encoding: utf-8

"""> FileName: rds.py

> Author: FZH

> Mail: fengzhihai@ilarge.cn

> CreatedTime: 2020-03-22 16:49"""

importredisclassRedisHelper(object):"""host: redis ip

port: redis port

channel: 发送接送消息的频道"""

def __init__(self,

host,

port,

db,

channel,

password=None):

self.host=host

self.port=port

self.db=db

self.password=password

self.channel=channel

self.__conn =redis.Redis(self.host,

self.port,

self.db,

self.password,

decode_responses=True)defping(self):try:

self.__conn.ping()returnTrueexceptException as e:print(e)returnFalse#发送消息

defpublic(self,

msg):ifself.ping():

self.__conn.publish(self.channel,

msg)returnTrueelse:returnFalse#订阅

defsubscribe(self):ifself.ping():#打开收音机

pub = self.__conn.pubsub()#调频道

pub.subscribe(self.channel)#准备接收

pub.parse_response()returnpubelse:return False

2.4 public_info.py 发送消息:

#!/usr/bin/env python#encoding: utf-8

"""> FileName: public_info.py

> Author: FZH

> Mail: fengzhihai@ilarge.cn

> CreatedTime: 2020-03-22 17:06"""

importjsonimportconfigparserfrom rds importRedisHelper

config=configparser.ConfigParser()

config_file= "config.ini"config.read(config_file)

sec= config["DEV"]

redis_host= sec["redis_host"]

redis_port= sec["redis_port"]

redis_db= sec["redis_db"]

redis_channel= sec["redis_channel"]

redis_password= sec["redis_password"]if len(redis_password) ==0:

redis_password=Nonedefpub_info(app_name,

app_version,

app_owner,

app_desc,

deploy_res):

info={"app_name": app_name,"app_version": app_version,"app_owner": app_owner,"app_desc": app_desc,"deploy_res": deploy_res

}

obj= RedisHelper(host=redis_host,

port=redis_port,

db=redis_db,

channel=redis_channel,

password=redis_password)

res= obj.public(msg=json.dumps(info))ifres:print('public successful.')else:print('public fail.')if __name__ == '__main__':

app_name= 'inf-demo'app_version= '1.1'app_owner= 'fengzhihai'app_desc= 'inf group demo application'deploy_res= 'SUCCESS'pub_info(app_name=app_name,

app_version=app_version,

app_owner=app_owner,

app_desc=app_desc,

deploy_res=deploy_res)

2.5 subscribe_info.py 订阅消息:

#!/usr/bin/env python#encoding: utf-8

"""> FileName: subscribe_info.py

> Author: FZH

> Mail: fengzhihai@ilarge.cn

> CreatedTime: 2020-03-22 17:07"""

importtimeimportconfigparserfrom rds importRedisHelper

config=configparser.ConfigParser()

config_file= "config.ini"config.read(config_file)

sec= config["DEV"]

redis_host= sec["redis_host"]

redis_port= sec["redis_port"]

redis_db= sec["redis_db"]

redis_channel= sec["redis_channel"]

redis_password= sec["redis_password"]if len(redis_password) ==0:

redis_password=Nonedefsub_info():

obj= RedisHelper(host=redis_host,

port=redis_port,

db=redis_db,

channel=redis_channel,

password=redis_password)

sub_obj=obj.subscribe()whileTrue:ifsub_obj:

now_time= time.strftime('%Y-%m-%d %H:%M:%S',

time.localtime(time.time()))

msg=sub_obj.parse_response()print('receive:', now_time, msg)else:break

if __name__ == '__main__':

sub_info()

三、测试:

3.1 开启循环 监听redis channel消息:

3.2 发送消息:

python public_info.py

修改app_name再次发送消息。

3.3 监听结果:

拿到发布结果后,我们就可以对结果进行分析再处理,在前端展示了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值