外观
一句话答案
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 脚本可以操作这些 keyCluster 的架构图:
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,因为事务不回滚等于没保障。