首页 > 解决方案 > Redis mget 无法与 redis-py-cluster 客户端按预期工作

问题描述

我正在使用“redis-py-cluster”连接到我们的 Redis 集群。我们需要一次调用从 redis 集群中查询 100 个键。我使用 redis 主题标签(带有 {})将所有键散列到一个节点(例如:{feed}1、{feed}2、{feed}3 是一些示例键)。

我没有注意到顺序查询 100 个键和使用 mget 查询 100 个键之间的时间差。这里的示例代码:

rconn = RedisCluster(startup_nodes=self.startup_nodes, decode_responses=True)
flist=['{feed}1','{feed}2','{feed}3','{feed}4'....'{feed}100']
time1 = time.time()
for i in range(1,len(flist)):
    feed_s = rconn.get(flist[i])
print("Feeds get one by one time:%f", time.time()-time1)
time2 = time.time()
feed_m = rconn.mget(flist)
print("Feeds mget time:%f", time.time()-time2)

“redis-py-cluster”是否支持mget?这是使用mget查询的正确方法吗?

版本:redis-cluster 版本:5.0.7,python:3.6,redis-py-cluster:2.0.0

请帮忙,谢谢!

标签: pythonredisredis-clusterredis-pymget

解决方案


与 multislot 一起使用的命令无法使用 redis-py 中的常规实现,因此必须执行其他方法或解决方法,以便像正常 redis-py 方法一样支持 mget 命令。

mget 命令是这些命令之一。如果您在此处查看此方法的当前集群实现https://github.com/Grokzen/redis-py-cluster/blob/master/rediscluster/client.py#L891,您将看到它通过模仿输入和来自 redis-py 的上游版本的输出,但它会更改内部实现,因为您可能必须与不同的服务器通信。

因此,为了使代码成为直接替换而不更改您的代码,集群 mget 将按顺序迭代每个键并获取值并以相同格式返回单个服务器案例的数据。使用当前的实现不会有任何性能提升,但没有其他方法可以以任何其他方式实现该方法,这会带来一些性能提升,更重要的是实现该方法以相同的方式工作,而不是让相同的表现。


推荐阅读