--pipe 是什么
redis-cli --pipe 把标准输入里的协议数据以最快速度灌进实例,省掉逐条往返,用于批量写入与数据导入。它读取的是 Redis 能解析的协议字节流,导入结束后打印 errors 与 replies 两行统计,用来确认有没有命令被拒。它没有事务语义,中途断开时前面的命令已经生效。
基本信息
| 用法 | cat data.txt | redis-cli --pipe |
|---|---|
| 输入格式 | RESP 协议数据,需以 \r\n 结尾 |
| 目标实例 | 用 -h、-p、-n 指定主机、端口与库 |
| 结束输出 | errors 与 replies 两行统计 |
| 事务语义 | 无,逐条执行,失败不回滚 |
| 限速手段 | 无内置开关,靠分批导入控制节奏 |
典型使用场景
- 批量灌数据:把离线生成的键值一次导入测试或预发环境
- 数据迁移:小规模数据集跨实例搬运,不需要复制拓扑
- 压测前造数据:快速铺满指定规模的键空间
- 故障演练后重建:把备份导出的数据重新灌回实例
- 校验工具链:确认生成的数据文件本身格式正确
最小示例
最小示例
# 生成 RESP 格式的 1000 条 SET,每条三行参数、\r\n 结尾
awk 'BEGIN{for(i=1;i<=1000;i++) printf "*3\r\n$3\r\nSET\r\n$5\r\nk:%05d\r\n$5\r\nv:%05d\r\n", i, i}' > data.txt
cat data.txt | redis-cli -h 127.0.0.1 -p 6379 --pipe # 全速导入
redis-cli DBSIZE # 导入后核对键数量
redis-cli GET k:00042 # 抽样校验内容输出怎么读
| 输出或现象 | 含义 | 动作 |
|---|---|---|
| errors: 0, replies: N | 全部命令被接受 | 与 DBSIZE 核对数量后收工 |
| errors 大于 0 | 部分命令被拒 | 找格式或类型错误,修正数据后重跑 |
| 连接中断且无输出 | 中途失败,前面已执行 | 靠键数与抽样定位断点后幂等重跑 |
| replies 远超预期 | 文件被重复执行或含重复命令 | 导入前去重,重跑前先清理 |
--pipe 不做事务:中途失败不会回滚。重跑前确认命令是幂等的(SET、HSET 这类是),否则要先清理目标键或改用带校验的迁移工具。
导入期间内存与主库压力上升明显,建议低峰执行并切成多份;分批除了降低峰值,也让失败重试的代价小得多。
不要把没验证过的数据直接灌进生产主库:先在测试实例跑一遍,确认 errors 为 0 再上,避免把脏数据一次性铺开。