大家好,我是 31 岁、依旧热爱折腾技术的小米。
有一次,我凌晨两点被拉进一个紧急会议。线上没挂,接口也没超时,但业务同学一句话把我整清醒了:“历史数据导入 Redis,要 6 个小时,老板等不了。”
那一刻,我脑子里只剩一个问题:Redis,不就是个快得离谱的内存数据库吗?怎么插个几千万条数据,比我下班还慢?
后来,这个问题几乎成了我参加社招面试时的“保留节目”:Redis 如何做大量数据插入?
如果你也在面试中被问到这个问题,或者你真的遇到过“Redis 批量写入慢到怀疑人生”的场景,这篇文章,你一定要看到最后。
为什么“for 循环 + SET”一定会翻车?
我们先从最容易踩坑的方式说起。很多人第一次往 Redis 灌数据,代码大概长这样:
你敲下回车,心想:
- Redis 单线程、内存操作、QPS 几万起步
- 100 万条数据,分分钟的事
但现实是:
- CPU 占用不高
- Redis 没有明显压力
- 程序却慢得像在给 Redis 写情书
问题出在哪?
Redis 慢,不是慢在“算力”,而是慢在“来回跑腿”
我后来给新人讲 Redis 批量插入时,都会打一个比喻。Redis 就像一个效率极高的仓库管理员:
- 他干活非常快
- 但每接一个指令,都要你亲自跑到仓库门口说一句话
如果你是这样干的:
- 跑过去 → “存一箱货” → 跑回来
- 跑过去 → “再存一箱” → 跑回来
- ……
那么再快的仓库管理员,也会被你拖垮。
Redis 普通写入的真实成本
一次 SET 命令,至少包含:
- 客户端到 Redis 的网络传输
- Redis 解析命令
- 执行写入
- Redis 返回结果
- 客户端接收响应
大量插入 = 大量 RTT(网络往返)
真正慢的,从来不是 Redis,而是:你和 Redis 之间来回跑的那条“路”
面试官真正想听的关键词:Pipeline
如果你在社招面试中,被问到:Redis 如何做大量数据插入?一个合格答案,至少要说出三个字:Pipeline(管道)
在 Java 里,你可能会写:
这已经比普通 SET 快很多了。但如果你回答到这里,面试官大概率会追问一句:“那如果是离线导入上亿数据呢?”
这个时候,redis-cli 的 pipe mode,就该登场了。
Redis 2.6 的“隐藏大招”:pipe mode
很多人不知道,从 Redis 2.6 开始,redis-cli 就支持了一种专门用于大量数据插入的模式:pipe mode(管道模式)
它的核心思想只有一句话:不等 Redis 回答,一口气把命令全塞进去
命令长这样:
这行命令,在我眼里堪称:Redis 批量写入界的“核武器”
pipe mode 到底做了什么?
我们还是用故事来讲。
1、普通模式(你等一句,我回一句)
2、pipe mode(你说完我再统一处理)
关键差异在于:
- 普通模式:每条命令都有一次等待
- pipe mode:命令连发,不等响应
Redis 在服务端内部依然是顺序执行的,但网络等待被极度压缩。
pipe mode 使用示例(面试必背)
1、准备数据文件
Redis 支持 RESP 协议,所以你可以直接构造命令文件:
保存为 data.txt
2、使用 pipe mode 导入
导入完成后,你会看到类似输出:
RESP 协议级写入(高阶玩法)
如果你要导入千万 / 上亿级别数据,面试官往往会期待你知道:RESP 协议格式导入
示例:
配合:
这种方式:
- 跳过命令解析
- 极致压榨 Redis 写入性能
- 是很多 数据迁移、冷启动 场景的终极方案
不同插入方式的性能对比(面试加分项)
下面这张表,我建议你直接背下来。
为什么 pipe mode 比 Java Pipeline 还快?
这是面试官特别喜欢追问的一点。原因有三点:
- 少了一层客户端封装: redis-cli 更贴近协议层
- 没有对象创建和序列化成本
- IO 利用率更高
一句话总结就是:redis-cli 是“贴着 Redis 地板飞”
真实生产经验:什么时候该用 pipe mode?
我在项目里一般这样选:
如果你在面试中能说出这张表,面试官基本已经在心里给你加分了。
面试标准答案(可直接复述)
最后,给你一段社招面试可直接说的总结版:
Redis 大量数据插入时,单条 SET 会因为频繁网络往返导致性能极差。
一般在线业务使用 Pipeline 批量写入;对于离线或历史数据导入,Redis 从 2.6 开始支持 redis-cli 的 pipe mode,通过一次性发送大量命令、减少 RTT,实现百万甚至千万级数据的高效导入。
END
Redis 从来不慢,慢的往往是我们没选对打开方式。
如果你正在准备 Java 社招面试,或者你正在和“Redis 批量插入慢”死磕,希望这篇文章,能帮你少踩一个坑。
好朋友,我们下篇见。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!