Redis MGET 性能

问题描述 投票:0回答:2

我正在尝试加载 redis 数据库中的所有值,我正在使用 redis 库中的 mget(r.keys()) 。数据库中有接近 100k 个键值对,每个大小约为 40kb。在 RAM 超过 64GB 的 Windows 计算机上执行此操作需要将近 38 秒。

我已将 100k json 转储的 numpy 数组加载到 redis 数据库中,并运行下面所示的代码来捕获读取数据所需的时间。

import redis
import time
start=time.time()
r=redis.StrictRedis(host='localhost',port=6379,db=0)
test=r.mget(r.keys())
print(time.time()-start)

在具有 >50GB 可用 RAM 的 Windows 计算机上,所需时间约为 38 秒。我在运行时检查了系统性能,没有出现瓶颈。我期望更快的读取性能,但有人可以确认这是否是预期的行为或者我是否做错了什么。

python redis
2个回答
3
投票
不建议使用

r.keys()
,应考虑使用
scan()
代替。

通过调用

keys()
,您基本上是要求 Redis 生成所有键的列表并将它们返回给客户端,这是一个长时间的阻塞操作。

然后,通过调用

r.mget()
,您将所有 100k 个键的列表发送回 Redis,并要求它生成所有哈希值的一个大结果。

我建议您改用

scan()
并批处理来自 Redis 的结果。 最后,一旦您进入批次,以避免在请求下一批之前等待每个批次返回,您可能需要使用 pipline。


0
投票

如果您还希望 Redis 节点在执行此操作时提供正常的读取流量,那么您可能会做一些“错误”的事情。提供集群结果所花费的时间非常昂贵,并且其他操作将开始超时。

您可以采用的一种策略是将这些数据存储在哈希结构中。此时您可以利用 HSCAN 下载您需要的数据。 HSCAN 相对于keys() 的优点是它将使用基于游标的方法以更加分页的方式下载数据。代价是会产生一点额外的延迟,但好处是瓶颈更少。

如果您不想使用哈希,扫描和批处理是更好的方法,尽管您需要在您的端管理批处理。

© www.soinside.com 2019 - 2024. All rights reserved.