Python使用json可视化Redis集群中的protobuf数据

背景

在项目中,数据经过protobuf序列化后存入Redis集群。这是由c++来做的。

但pb序列化的数据是二进制的,不便于人工查看。

通过RedisDesktopManager查看时,是这样的:

可以使用Python写个脚本反序列化一下,并打印出json格式的字符串,这样调试就方便多了。

Python连接Redis集群

Python连接Redis和连接Redis集群使用的包是不一样的。

默认的redis只能连接Redis单实例,使用redis-py-cluster连接到集群:

pip install redis-py-cluster

代码如下:

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

from rediscluster import RedisCluster

# 至少需要一个master节点,最好全部输入
startup_nodes = [{"host": "192.168.1.2", "port": 7000}, 
    {"host": "192.168.1.5", "port": 7001}, 
    {"host": "192.168.1.4", "port": 7002}]

# 连接到Redis集群
rc = RedisCluster(startup_nodes=startup_nodes, 
                            # 有密码要加上密码哦
                            skip_full_coverage_check=True,
                            decode_responses=False, 
                            password='123456')

rc.set("k", "v")
print(rc.get(""k))

pb_result = rc.hget("key", "field")
print(pb_result)

ok,这样就可以操作Redis了。

注意,连接参数:

  • skip_full_coverage_check=True ,这一行一定要写上,不写上可能会报错:

在这里插入图片描述

  • decode_responses=False,这个其实不用写,默认的就行,但是一定不能是True,因为protobuf编码是二进制的,如果直接解码会报错:
    在这里插入图片描述

当然,如果你的数据全部都是string形式存储的,设置为True后,可以直接得到str数据,不必再从byte转为str了。

  • password:需要密码就写,不需要不写
Json可视化

protobuf支持直接把序列化数据以Json格式展示。

代码如下:

from google.protobuf.json_format import MessageToJson
import demo_pb2 # protoc生成的py文件:protoc sap.proto --python_out=.

# 这是我从Redis中直接复制出来的,注意编码为byte
pb_result = b'\n\x06000001\x12\x0f210415000000001\x1a\x04SZSE \x01(\xecY@\x98\x8b\x02H\xa8\xa7\x02R\x06888888Z\x0810000003b\x06444444j\x0844440930p\xf8\x88\x02'

req = sap_pb2.test() # proto文件中的message,在py中是类
req.ParseFromString(pb_result)

# preserveing_proto_field_name 设置为 True 可以保留 protobuf 的原有字段名,不然会自动转驼峰,如 request_id 会被自动转化为 requestId 
print(MessageToJson(req, preserving_proto_field_name=True))

这样就可以输出json格式的结果了。

小结

上述过程的完整代码示例如下:

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

from rediscluster import RedisCluster
from google.protobuf.json_format import MessageToJson
import demo_pb2 # protoc生成的py文件:protoc sap.proto --python_out=.

# 至少需要一个master节点,最好全部输入
startup_nodes = [{"host": "192.168.1.2", "port": 7000}, 
    {"host": "192.168.1.5", "port": 7001}, 
    {"host": "192.168.1.4", "port": 7002}]

# 连接到Redis集群
rc = RedisCluster(startup_nodes=startup_nodes, 
                            # 有密码要加上密码哦
                            skip_full_coverage_check=True,
                            decode_responses=False, 
                            password='123456')

pb_result = rc.hget("key", "field")
print(pb_result)

req = sap_pb2.test() # proto文件中的message,在py中是类
req.ParseFromString(pb_result)

# preserveing_proto_field_name 设置为 True 可以保留 protobuf 的原有字段名,不然会自动转驼峰,如 request_id 会被自动转化为 requestId 
print(MessageToJson(req, preserving_proto_field_name=True))

可以看到,使用python来可视化pb还是比较简单的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,连接Redis集群时同样可以使用连接池来管理连接。下面是一个使用连接池连接Redis集群的示例代码: ```python import redis from rediscluster import RedisCluster from redis.connection import ConnectionPool startup_nodes = [{"host": "localhost", "port": "7000"}, {"host": "localhost", "port": "7001"}] pool = ConnectionPool.from_url("redis://localhost:7000", max_connections=10) r = RedisCluster(startup_nodes=startup_nodes, connection_pool=pool) r.set('key', 'value') value = r.get('key') print(value) ``` 在这个示例,我们首先创建了一个Redis集群的节点列表startup_nodes。然后,我们使用ConnectionPool.from_url()方法创建了一个连接池对象,并将其传递给RedisCluster()构造函数。在执行Redis命令时,RedisCluster对象会从连接池获取一个连接来执行操作。在操作完成后,连接会自动返回到连接池,以便其他操作可以重用它。 连接池同样可以设置最大连接数和超时时间等参数,以适应不同的应用场景。例如: ```python pool = ConnectionPool.from_url("redis://localhost:7000", max_connections=10, timeout=5) ``` 在这个示例,我们设置了连接池的最大连接数为10,超时时间为5秒。当连接池的连接已经被全部使用且没有空闲连接时,新的连接请求会被阻塞,直到有连接被释放为止。同时,连接的超时时间也可以避免连接被长时间占用而无法释放的情况发生。 通过使用连接池,可以显著提高Redis集群连接的效率和稳定性,特别是在高并发和大规模数据处理的场景下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值