Redis MGET性能

时间:2019-07-17 12:49:08

标签: python redis

我正在尝试从redis库中使用mget(r.keys())加载redis数据库中的所有值。数据库中有近100k个键值对,每个值对的大小约为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可用RAM的Windows机器上花费的时间约为38秒。我在运行时检查了系统性能,没有瓶颈。我期望更快的读取性能,但是有人可以确认这是预期的行为还是我做错了什么。

1 个答案:

答案 0 :(得分:1)

r.keys()是不推荐的,应该考虑使用scan()

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

然后,通过调用r.mget(),将这10万个密钥的所有列表发送回Redis,并要求它生成所有哈希值的一个大结果。

我建议您切换为使用scan()并从Redis批处理结果。 最后,一旦移入批次以避免在等待下一个批次返回之前要求下一个批次,则可能要使用pipline。