真实面经题目 · 原创解析

Redis 怎么做数据迁移?

Redis 数据迁移没有单一标准答案,要按停机窗口、数据规模、是否跨版本、是否集群、是否需要保留 TTL 和一致性要求选择方案。常见方式包括 RDB/AOF 迁移、主从复制切换、SCAN+DUMP/RESTORE、MIGRATE、集群 reshard 和专用同步工具。

出现于:字节跳动 · 技术客户成功

60 秒回答模板

Redis 数据迁移可以先按场景分类。离线全量迁移可以停写或短暂停机,使用 RDB 或 AOF 文件在目标实例恢复,优点是简单,缺点是停机窗口和版本兼容要控制。低停机迁移通常把目标实例挂成源实例从库,先完成全量同步,再持续追增量,最后短暂停写、校验 offset、切流。小规模或按 key 迁移可以用 SCAN 遍历配合 DUMP/RESTORE 保留序列化值和 TTL,也可以使用 MIGRATE 原子地把 key 从源迁到目标。Redis Cluster 内部迁移槽位时通过 reshard 和 MIGRATE 把 slot 迁到新节点。无论哪种方式,都要提前检查数据量、大 key、热 key、TTL、模块类型、版本兼容、内存容量、网络带宽,并在迁移后做 key 数、抽样校验、业务读写验证和回滚预案。

考点 按约束选方案
难度 真实面经高频题
回答目标 讲清机制、边界和追问

深入解析

01

离线文件迁移

最简单的方式是用 RDB 或 AOF 文件迁移。源实例生成持久化文件,把文件复制到目标环境,再启动或加载目标实例。这适合可停机、数据量可控、版本兼容明确的场景。它的优点是步骤少、完整性好;缺点是停机时间取决于生成、传输和加载速度,迁移期间新增写入需要额外处理。

02

复制迁移和切流

低停机迁移常用主从复制。先让目标实例作为源实例从库完成全量同步,再持续接收增量命令。到切换时短暂停写,等待复制偏移追平,校验关键数据,然后把业务连接切到目标实例。这个方案能显著缩短停机窗口,但要注意复制延迟、网络抖动、源目标配置差异和切回方案。

03

按 key 迁移

当只迁移部分 key、拆分业务前缀或做灰度迁移时,可以用 SCAN 分批遍历,配合 DUMP/RESTORE 在目标写入序列化数据并保留 TTL。MIGRATE 命令也能把指定 key 从一个实例迁到另一个实例。按 key 迁移灵活,但要控制批大小、超时、热 key 影响和迁移过程中的并发写一致性。

04

集群槽位迁移

Redis Cluster 的迁移核心是 slot。扩容、缩容或重平衡时,需要把某些 slot 从源节点迁到目标节点,过程中节点会进入 importing 和 migrating 状态,相关 key 通过 MIGRATE 移动。客户端必须支持集群重定向,能处理 MOVED 和 ASK。集群迁移要重点关注槽位覆盖、热点槽、跨节点流量和失败重试。

05

校验和回滚

迁移成败不只看命令执行完成。迁移前要做容量评估、big key 扫描、版本和模块兼容检查;迁移中监控延迟、错误、复制 offset、内存和网络;迁移后做 dbsize 对比、抽样 GET、TTL 检查、业务冒烟和只读回放。切流要保留回滚窗口,避免发现数据缺失时已经无法回到源实例。

易错点

  • 不区分离线迁移、低停机迁移、按 key 迁移和集群 slot 迁移。
  • 迁移全量数据时忽略迁移期间的增量写入,导致目标库缺数据。
  • 用 KEYS 在线遍历大库,造成 Redis 阻塞和业务延迟。
  • 只比较 key 数,不校验 TTL、数据类型、抽样值和业务读写结果。

面试官追问

线上 Redis 迁移如何尽量减少停机?

通常用复制迁移:目标先作为从库追全量和增量,切换前短暂停写,等待 offset 追平并完成校验,然后修改业务连接。这样停机主要集中在最终切流窗口。

为什么不能直接用 KEYS 扫描迁移?

KEYS 会一次性遍历整个键空间,数据量大时会阻塞 Redis,影响线上请求。应使用 SCAN 分批游标遍历,并控制每批迁移大小和节奏。

DUMP/RESTORE 和普通 GET/SET 迁移有什么区别?

DUMP/RESTORE 使用 Redis 内部序列化格式,可以保留复杂数据结构,并能配合 TTL 恢复过期时间。GET/SET 只适合字符串,无法直接覆盖所有类型和元信息。

集群迁移时客户端要注意什么?

客户端要支持 Redis Cluster 的 MOVED 和 ASK 重定向,并正确刷新 slot 缓存。迁移期间如果客户端不支持重定向,可能出现短暂读写失败或请求打到错误节点。