Skip to content
基础

一句话答案

Pipeline 将多个命令打包一次发送,减少网络往返次数(RTT),批量操作性能提升数倍。

核心要点

扩容(添加新节点 + 分配 slot):

场景:现有 3 主 3 从,新增 Node D(主) + Node D'(从)

1. 添加节点到集群:
   redis-cli --cluster add-node <新节点ip:port> <集群任意节点ip:port>

2. 分配 slot(resharding):
   redis-cli --cluster reshard <集群节点ip:port>
   → 指定要迁移的 slot 数量(如从 A/B/C 各迁出部分 slot 给 D)
   → 工具自动完成 slot 迁移

3. 为新主节点添加从节点:
   redis-cli --cluster add-node <从节点ip:port> <集群节点ip:port> \
     --cluster-slave --cluster-master-id <Node D的ID>

Slot 迁移的详细过程(单个 slot):

将 slot X 从 Node A 迁移到 Node D:

1. Node D: CLUSTER SETSLOT X IMPORTING <A的nodeId>
   → D 准备导入 slot X 的数据

2. Node A: CLUSTER SETSLOT X MIGRATING <D的nodeId>
   → A 将 slot X 标记为迁移中

3. 循环迁移 key:
   ① CLUSTER GETKEYSINSLOT X 100        # 从 A 获取 slot X 中的 100 个 key
   ② MIGRATE <D的ip> <D的port> "" 0 5000 KEYS key1 key2 ...  # 原子迁移到 D
   ③ 重复直到该 slot 的所有 key 迁移完毕

4. 通知所有节点 slot X 现在属于 D:
   CLUSTER SETSLOT X NODE <D的nodeId>  # 向所有节点广播

迁移期间的数据访问:
  客户端访问 slot X 的 key:
  ├─ key 还在 A → A 正常返回
  └─ key 已迁移到 D → A 返回 ASK 重定向 → 客户端向 D 查询

缩容(移除节点):

1. 将待移除节点的 slot 迁移到其他节点(resharding)
2. 确认该节点 slot 为空后:
   redis-cli --cluster del-node <集群节点ip:port> <待移除节点ID>
3. 如果移除的是主节点,其从节点会自动挂到其他主节点下
追问与易错

追问方向:

  • Pipeline 和事务的区别?
  • Pipeline 命令数量有限制吗?
  • Pipeline 可以跨 Cluster 节点吗?

易错点:

  • ❌ Pipeline 是原子的——不是,只是批量发送
  • ❌ Pipeline 中某条失败会回滚——不会

💡 记忆锚点

Pipeline = 攒快递:一个个寄(逐条命令)太慢,攒一箱一起寄(批量发送),省的是跑邮局的路费(RTT),但箱子里每件包裹仍然独立,丢一个不影响其他。