java 社招面试题:Redis 如何做大量数据插入?

0 阅读5分钟



大家好,我是 31 岁、依旧热爱折腾技术的小米

有一次,我凌晨两点被拉进一个紧急会议。线上没挂,接口也没超时,但业务同学一句话把我整清醒了:“历史数据导入 Redis,要 6 个小时,老板等不了。”

那一刻,我脑子里只剩一个问题:Redis,不就是个快得离谱的内存数据库吗?怎么插个几千万条数据,比我下班还慢?

后来,这个问题几乎成了我参加社招面试时的“保留节目”:Redis 如何做大量数据插入?

如果你也在面试中被问到这个问题,或者你真的遇到过“Redis 批量写入慢到怀疑人生”的场景,这篇文章,你一定要看到最后。

为什么“for 循环 + SET”一定会翻车?

我们先从最容易踩坑的方式说起。很多人第一次往 Redis 灌数据,代码大概长这样:

你敲下回车,心想:

  • Redis 单线程、内存操作、QPS 几万起步
  • 100 万条数据,分分钟的事

但现实是:

  • CPU 占用不高
  • Redis 没有明显压力
  • 程序却慢得像在给 Redis 写情书

问题出在哪?

Redis 慢,不是慢在“算力”,而是慢在“来回跑腿”

我后来给新人讲 Redis 批量插入时,都会打一个比喻。Redis 就像一个效率极高的仓库管理员:

  • 他干活非常快
  • 但每接一个指令,都要你亲自跑到仓库门口说一句话

如果你是这样干的:

  • 跑过去 → “存一箱货” → 跑回来
  • 跑过去 → “再存一箱” → 跑回来
  • ……

那么再快的仓库管理员,也会被你拖垮。

Redis 普通写入的真实成本

一次 SET 命令,至少包含:

  1. 客户端到 Redis 的网络传输
  2. Redis 解析命令
  3. 执行写入
  4. Redis 返回结果
  5. 客户端接收响应

大量插入 = 大量 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!