集群使用限制是什么
集群为了分片牺牲了一部分多键能力:只有 0 号库、多键操作必须同槽、脚本与事务里的键也必须同槽、全量类命令只作用于当前节点。这些限制不是缺陷而是设计取舍,改造代码前必须先理解,否则上线后才发现批量命令报错,返工代价很高。
基本信息
| 库数量 | 只有 0 号库,切换库命令不可用 |
|---|---|
| 多键操作 | 读写多个键时必须落在同一个槽 |
| 脚本与事务 | 其中涉及的所有键必须同槽 |
| 全量命令 | 清库等命令只作用于当前节点,需要逐节点执行 |
| 遍历命令 | 扫描只能覆盖当前节点,全量遍历要遍历所有主节点 |
典型使用场景
- 代码改造评估:梳理现有批量操作,判断哪些需要改成同槽访问
- 键设计前置:在设计阶段确定哈希标签方案,避免后期大规模返工
- 数据统计:需要全集群统计时用逐节点调用的方式采集
- 批量清理:清空数据要逐节点执行,不能指望一条命令搞定
- 客户端选型:确认客户端支持重定向与集群拓扑刷新
逐节点执行与遍历
逐节点执行与遍历
# 逐节点执行命令(对集群所有主节点)
redis-cli --cluster call 10.0.0.1:6379 DBSIZE
redis-cli --cluster call 10.0.0.1:6379 SCAN 0 COUNT 100
# 集群感知客户端直接遍历(自动跟随重定向)
redis-cli -c --scan --pattern 'user:*'
# 查看槽分配是否完整
redis-cli -c -p 6379 CLUSTER INFO | grep -E "cluster_state|cluster_slots_assigned"
# 跨槽批量操作会报错(错误信息含跨槽提示)
redis-cli -c MGET user:88:name user:99:name限制清单
| 限制项 | 表现 | 应对 |
|---|---|---|
| 只有 0 号库 | 切换库命令不可用 | 用键前缀区分业务,不再依赖多库 |
| 多键必须同槽 | 跨槽批量命令报错 | 用哈希标签让相关键同槽 |
| 脚本键必须同槽 | 跨槽脚本直接报错 | 脚本内键全部用同一标签 |
| 清库只影响单节点 | 数据仍留在其他节点 | 逐节点执行或使用集群工具 |
| 扫描只覆盖单节点 | 遍历结果不完整 | 遍历所有主节点或改用集群感知客户端 |
为集群改造代码就三件事:收敛多键操作、设计哈希标签、换用集群感知客户端;这三件事没做好,后期排障会非常痛苦。
把清库或全量扫描当成全局操作:实际只影响一个节点,会造成数据残留或统计口径错误。