python连接redis/codis_直连与通过kz代理连接

在我们的模型部署实时预测的时候,需要通过redis拿取实时数据。所以需要对redis进行连接与get操作。

依赖

pip install redis
pip install kazoo

一. 直连示例

class redisDB:
    """
    https://www.runoob.com/w3cnote/python-redis-intro.html
    """
    def __init__(self, connect_dict):
        self.r = redis.StrictRedis(**connect_dict)

    def set(self, k, v):
        self.r.set(k, v)

    def get(self, k):
        return self.r.get(k).decode('utf-8')

    def hmget(self, k, *filed):
        return [i.decode('utf-8') if i is not None else i for i in self.r.hmget(k, *filed)]

    def hmset(self, k, f_dict):
        for field, v in f_dict.items():
            self.r.hset(k, field, v)

二、通过zk代理连接

主要步骤如下:

  • 连接zk: 通过KazooClient("host:port;host:port")连接
  • 通过zk.get_children方法获取proxy
    • codis_children = [i for i in self.zk.get_children('/') if 'codis' in i][0] 这部分也可以询问DBA同学确定
    • 【注:】一般有多个proxy,所以抽取一个
  • 通过get方法获取代理
    • 通过get获取: zk.get(proxy路径 )
    • 解析get后的json 获取代理的host:port
  • 连接并返回redis实例
    • 和 一 中的方法一致
class zkCodis:
    def __init__(self, zk_codis_config: dict):
        """
        params zk_codis_config: {
            "name": "codis-name",
            "passwd": "codis-passwad",
            "zkServer": "host:port;host:port",
            "timeout": 5*60
            }
        """
        self.zk_codis_config = zk_codis_config
        self.zk = KazooClient(zk_codis_config['zkServer'], randomize_hosts=True, timeout=zk_codis_config['timeout'])
        self.zk.start()
        self.proxy_url = self.__get_codis_proxy_url()
        self.codis_connect_config = None

    def __get_codis_proxy_url(self):
        codis_children = [i for i in self.zk.get_children('/') if 'codis' in i][0]
        uri = codis_children + '/' + self.zk_codis_config['name'] + '/proxy'
        proxy_list = self.zk.get_children(uri)
        proxy_url = uri + '/' + random.choice(proxy_list)
        return proxy_url

    def _get_codis_config(self):
        return json.loads(self.zk.get(self.proxy_url)[0].decode('utf-8'))

    def connect_codis(self):
        # 通过zk获取proxy
        self.proxy_url = self.__get_codis_proxy_url()
        # 通过get方法获取代理 host:port
        codis_info = self._get_codis_config()
        host_c, port_c = codis_info['proxy_addr'].split(':')
        username_c = self.zk_codis_config['name']
        password_c = self.zk_codis_config['passwd']
        codis_connect_config = dict(
            host=host_c, port=int(port_c), username=username_c, password=password_c
        )
        self.codis_connect_config = codis_connect_config
        # 连接并返回redis实例
        rds = redisDB(codis_connect_config)
        addr_ = codis_info['proxy_addr']
        name_ = self.zk_codis_config['name']
        print(f"Connect To {addr_} Codis-{name_}")
        return rds

# 示例
zk_codis = zkCodis(zk_codis_config=codis_config)
rds = zk_codis.connect_codis()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值