【问题标题】:Redis MGET performanceRedis MGET 性能
【发布时间】:2019-07-17 22:55:19
【问题描述】:

我正在尝试从 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 秒。我在运行时检查了系统性能,没有出现瓶颈。我期望更快的读取性能,但有人可以确认这是预期的行为还是我做错了什么。

【问题讨论】:

    标签: python redis


    【解决方案1】:

    不推荐r.keys(),应考虑改用scan()

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

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

    我建议您改用 scan() 并从 Redis 批处理结果。 最后,一旦您进入批次以避免在请求下一批之前等待每个批次返回,您可能想要使用管道。

    【讨论】:

    • 谢谢。我同时使用了扫描和管道。当我使用管道和扫描时,所花费的时间没有太大差异。但是,当我使用只扫描时所花费的时间减少到了 12 秒。我已经粘贴了用于创建和执行管道的代码。 12秒可以进一步优化吗? pipe=r.pipeline() for key in r.scan_iter(count=50000) : pipe.get(key) pipe.execute() 管道在循环外执行
    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2019-03-26
    • 2020-07-15
    • 2020-07-31
    相关资源
    最近更新 更多