redis 訂閱&發佈(轉載)

https://segmentfault.com/a/1190000016898228?utm_source=coffeephp.comphp

方法一:python

redis_helper.py: 封裝發佈訂閱方法redis

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: 發佈者segmentfault

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)

 

 

 

方法二:spa

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:對象

from redis_helper import RedisHelper


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

redis_sub.py:blog

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"] == "subscribe":
            print(str(i["channel"], encoding="utf-8"))

 

以上兩種方式的不一樣之處在於,方式一使用發佈訂閱對象的parse_response()方法獲取訂閱信息,方式二使用發佈訂閱對象的listen()方法獲取訂閱信息。listen()方法是對parse_response()方法的封裝,加入了阻塞,並將parse_response()返回的結果進行了處理,使結果更加簡單。utf-8

 ==================鏈接池

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
 
pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('name', 'zhangsan')   #添加
print (r.get('name'))   #獲取
相關文章
相關標籤/搜索