我有大约 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 许可协议
关于问题和示例代码的几点。
流水线不是灵丹妙药——您需要在使用之前了解它的作用。流水线的作用是批量发送多个操作,它们来自服务器的响应也是如此。您获得的是每个操作的网络往返时间被批处理的网络往返时间所取代。但是无限大小的批处理确实会消耗资源——你需要保持它们的大小足够小才能有效。根据经验,我通常尝试将每个管道的目标定为 60KB,并且由于每个数据都不同,因此管道中的实际操作数量也不同。假设您的密钥及其值是 ~1KB,您需要每 60 次左右的操作调用
pipeline.execute()
一次。除非我严重误解,否则这段代码不应该运行。您正在使用
HMSET
就好像它是SET
一样,所以您基本上缺少哈希的字段-> 值映射。哈希 (HMSET
) 和字符串 (SET
) 是不同的数据类型,因此应相应地使用。看起来好像这个小循环负责整个“十亿数据”——如果是这样的话,运行代码的服务器不仅会疯狂地交换,除非它有很多 RAM 来保存字典,它也将非常低效(无论 Python 的速度如何)。您需要通过运行此过程的多个实例来并行化数据插入。
您正在远程连接到 Redis 吗?如果是这样,网络可能会限制您的表现。
考虑您的 Redis 设置——假设它确实是一个瓶颈,也许可以调整/调整这些设置以获得更好的性能。