Redis MGET性能

4

我正在尝试加载redis数据库中的所有值,我使用redis库中的mget(r.keys())。该数据库中有近10万个键值对,每个大小约为40kb。在具有64GB以上RAM的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可用内存的Windows机器上,所需时间约为38秒。我在运行时检查了系统性能,没有发现瓶颈。我期望读取速度更快,但请问是否这是预期行为,或者我做错了什么。

1个回答

3

r.keys() 不被推荐使用,建议考虑使用 scan() 替代。

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

然后,通过调用 r.mget(),您会将这个包含100k个键的列表发送回 Redis,并请求它生成所有 Hashes 的一个大结果。

建议您切换到使用 scan() 并批量获取 Redis 中的结果。 最后,为了避免等待每个批次返回之前再请求下一批次,您可能希望使用 pipline。


谢谢。我同时使用了scan和pipeline。当我使用pipeline时,与scan一起使用时所花费的时间并没有太大的区别。然而,当我只使用scan时,所花费的时间减少到了12秒。我已经粘贴了我用于创建和执行管道的代码。这12秒可以进一步优化吗? pipe=r.pipeline() for key in r.scan_iter(count=50000) : pipe.get(key) pipe.execute() 管道是在循环外执行的。 - Karthik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接