我更倾向于使用 Pipeline 批量导入的方式,因为它能大幅减少网络往返时间,对于大量数据导入特别高效。下面是代码示例: redis_client.pipeline() as pipe: for item in data_list: pipe.set(item['key'], item['value']) pipe.execute()
方案一:单条命令导入
最简单的方法就是一条一条的 set 命令导入,比如 for 循环里面直接 client.set(key, value)。这种方式简单直观,适合小数据量,但大数据量时网络开销大,速度慢。
方案二:Pipeline 批量提交
Redis 的 Pipeline 可以把多条命令打包一次发送,减少 RTTReduce 网络延迟。Python 中用 redis-py 的 pipeline(),收集命令后一次性 execute()。实测导入 10 万条数据,Pipeline 比单条快 10 倍以上。
方案三:使用 redis-cli --pipe
命令行方式:cat data.txt | redis-cli --pipe。这是最快的导入工具,官方推荐,用于海量数据。数据格式是 *3 $3 set $3 key $5 value ,需要严格协议格式。
方案四:MSET 批量设置
如果键值对是已知的,可以用 MSET key1 val1 key2 val2 ... 一次性设置多个。但键太多会命令过长,不如 Pipeline 灵活。
方案五:从文件导入
准备好 Redis 协议格式的文件,直接 redis-cli --pipe < file.txt。速度飞起,百万级数据几分钟搞定。我导入 500 万条日志数据,用这个方案只要 2 分钟。
FAQ
Q: Pipeline 和 --pipe 哪个更快?
A: --pipe 更快,因为它是 C 实现的,零拷贝。
Q: 大数据量怎么避免内存爆掉?
A: 分批处理,每批 1-10 万条,用生成器逐批 Pipeline。
Q: 导入时怎么保证不重复?
A: 用 NX 参数 setnx key value,只在 key 不存在时设置。
Q: 支持 Hash 结构批量导入吗?
A: 支持,用 hmset 或 Pipeline 里的 hset 命令。