redis中的發佈/訂閱模型是一種消息通訊模式,今天聊一下在python中實現簡單的發佈訂閱功能。html
實現方式一:
redis_helper.py: 封裝發佈訂閱方法python
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: 發佈者redis
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: 封裝發佈訂閱方法code
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:htm
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()返回的結果進行了處理,使結果更加簡單。blog
參考自 連接描述utf-8
以上就是發佈/訂閱的簡單實現,若有錯誤,歡迎交流指正!get