建立了3个py文件
1. monitor.py文件将订阅、发布、保存服务器连接存活三者封装成一个class,这里使用线程,每隔一段时间,向redis服务器发一次ping连接,保证长时间连接redis服务器,不会和客户端断开。
# -*- coding:utf-8 -*-
import threading
import time
import redis
class RedisTest(object):
def __init__(self):
self.__conn = redis.Redis(host='127.0.0.1', port=6379, password='XXXX') # 连接Redis
def publish(self, channel, msg): # 定义发布方法
self.__conn.publish(channel, msg)
return True
def subscribe(self, channel): # 定义订阅方法
self.keep_alive() # 保证和redis服务器连接存活
pub = self.__conn.pubsub() # 可以看作是打开收音机
pub.psubscribe(channel) # psubscribe可以订阅多个频道
pub.parse_response() # 接收信息
return pub
def _ping(self):
"""
发个消息,刷存在感
"""
while True:
time.sleep(1)
# 尝试向redis-server发一条消息
print ('和redis服务器的连接是否连接:{0}'.format(self.__conn.ping()))
if not self.__conn.ping():
print('和redis服务器的连接是否连接:{0}'.format(self.__conn.ping()))
# 重新建立连接
del self.__conn
self.__conn = redis.Redis('127.0.0.1', port=6379, password='XXXX')
def keep_alive(self):
"""
保持客户端长连接
"""
thread_test = threading.Thread(target=self._ping)
thread_test.start()
2. publish.py用于消息的发布
# -*- coding:utf-8 -*-
# 发布
from monitor import RedisTest
def publish_test():
obj = RedisTest()
obj.publish('channel2', 'hello') # 发布
if __name__ == '__main__':
publish_test()
3. subscribe.py调用订阅,用于消息的接受。
# -*- coding:utf-8 -*-
# 订阅
from monitor import RedisTest
def subscribe_test():
obj = RedisTest()
channel_list = ['channel1', 'channel2']
redis_sub = obj.subscribe(channel_list) # 调用订阅方法
while True:
msg = redis_sub.parse_response()
print (msg)
if __name__ == '__main__':
subscribe_test()