Skip to content
进阶

一句话答案

Redis 事务(MULTI/EXEC)不支持回滚,Lua 脚本保证原子性且支持逻辑判断,生产推荐 Lua。

核心要点

Redis Cluster 核心特性:

  • 去中心化(无代理、无中心节点,P2P 架构)
  • 数据分片(16384 个 hash slot 分配到各节点)
  • 高可用(每个主节点配从节点,自动故障转移)
  • 水平扩展(可动态增减节点)

Hash Slot 分片机制:

Redis Cluster 将整个数据集划分为 16384 个 slot:

  key → CRC16(key) % 16384 → slot 编号 → 落在哪个节点

例:3 主节点的默认分配:
  Node A: slot 0 ~ 5460
  Node B: slot 5461 ~ 10922
  Node C: slot 10923 ~ 16383

为什么是 16384 个 slot(而不是更多)?

① 节点间通过 Gossip 协议交换 slot 信息,每次心跳包携带一个 bitmap
   16384 个 slot → bitmap 大小 = 16384 / 8 = 2KB(可接受)
   如果用 65536 个 slot → bitmap = 8KB,心跳包过大

② Redis Cluster 推荐最多 1000 个节点
   16384 个 slot 平均每个节点约 16 个 slot,足够均匀

③ 作者 Antirez 认为 16384 在工程上是最佳平衡点

Hash Tag(强制相关 key 落同一 slot):

bash
# 大括号 {} 内的部分参与 hash 计算
SET {user:1001}:info "Alice"
SET {user:1001}:cart "..."
# 两个 key 都按 "user:1001" 计算 slot → 落在同一节点
# 保证 MGET、Pipeline、Lua 脚本可以操作这些 key

Cluster 的架构图:

Client

  ├─→ Node A (Master) ──→ Node A' (Slave)     slot 0~5460
  ├─→ Node B (Master) ──→ Node B' (Slave)     slot 5461~10922
  └─→ Node C (Master) ──→ Node C' (Slave)     slot 10923~16383
       ↕ Gossip 通信
追问与易错

追问方向:

  • Redis 事务支持回滚吗?
  • Lua 脚本太长会怎样?
  • EVAL 和 EVALSHA 区别?

易错点:

  • ❌ Redis 事务和 DB 事务一样——不支持回滚
  • ❌ Lua 脚本可以很复杂——应尽量简短

💡 记忆锚点

Redis事务 = 排队买票(MULTI攒命令EXEC一起交,但有人买错票不会帮你退);Lua脚本 = 柜台VIP通道(原子执行还能带if/else逻辑)。生产选Lua,因为事务不回滚等于没保障。