如何高效的向 Redis 插入 Billion 数据?

新手上路,请多包涵

我有大约 20 亿个键值对,我想将它们有效地加载到 Redis 中。我目前正在使用 Python 并使用 Pipe ,如 redis-py 所记录的那样。我怎样才能加快以下方法?

 import redis

def load(pdt_dict):
    """
    Load data into redis.

    Parameters
    ----------
    pdt_dict : Dict[str, str]
        To be stored in Redis
    """
    redIs = redis.Redis()
    pipe = redIs.pipeline()
    for key in pdt_dict.keys():
        pipe.hmset(self.seller + ":" + str(key), pdt_dict[key])
    pipe.execute()

原文由 John Deep 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 446
2 个回答

关于问题和示例代码的几点。

  1. 流水线不是灵丹妙药——您需要在使用之前了解它的作用。流水线的作用是批量发送多个操作,它们来自服务器的响应也是如此。您获得的是每个操作的网络往返时间被批处理的网络往返时间所取代。但是无限大小的批处理确实会消耗资源——你需要保持它们的大小足够小才能有效。根据经验,我通常尝试将每个管道的目标定为 60KB,并且由于每个数据都不同,因此管道中的实际操作数量也不同。假设您的密钥及其值是 ~1KB,您需要每 60 次左右的操作调用 pipeline.execute() 一次。

  2. 除非我严重误解,否则这段代码不应该运行。您正在使用 HMSET 就好像它是 SET 一样,所以您基本上缺少哈希的字段-> 值映射。哈希 ( HMSET ) 和字符串 ( SET ) 是不同的数据类型,因此应相应地使用。

  3. 看起来好像这个小循环负责整个“十亿数据”——如果是这样的话,运行代码的服务器不仅会疯狂地交换,除非它有很多 RAM 来保存字典,它也将非常低效(无论 Python 的速度如何)。您需要通过运行此过程的多个实例来并行化数据插入。

  4. 您正在远程连接到 Redis 吗?如果是这样,网络可能会限制您的表现。

  5. 考虑您的 Redis 设置——假设它确实是一个瓶颈,也许可以调整/调整这些设置以获得更好的性能。

原文由 Itamar Haber 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以在管道模式下使用 redis-cli

  1. 首先你准备一个类似的文件(注意这些行应该以 cr/lf 终止或通过 -d <delimiter> 选项设置):

     SET Key0 Value0
    SET Key1 Value1
    ...
    SET KeyN ValueN
    
  2. 然后将其序列化为 Redis RESP 格式(例如作为带引号的字符串,请参阅 文档)。

  3. 最后将其通过管道传输到 redis-cli (使用 --pipe arg):

 cat data_in_resp_format.txt | redis-cli --pipe

原文由 stacker 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题