590 字
3 分钟
Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?本文
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

Redis Cluster 将 Key 映射到 16384 个槽位。多 Key 原子命令、事务和 Lua 脚本通常要求相关 Key 位于同一槽;跨槽时可能收到 CROSSSLOT。在同一主节点上不等于在同一槽,槽位才是这类检查的边界。

Hash Tag 怎样影响槽位?#

通常整个 Key 参与槽位计算;存在符合规则的非空花括号片段时,只对其中内容计算。例如:

SET order:{1001}:status created
SET order:{1001}:stock 10
MGET order:{1001}:status order:{1001}:stock

两个 Key 的 Tag 都是 1001,因此属于同一槽。其他字符仍使 Key 名不同,Tag 只是决定分片位置。只有符合规则的括号内容才作为 Tag;空的 {} 或复杂的多对括号不能凭视觉随意判断,应通过 CLUSTER KEYSLOT key 验证。

在 Cluster 中运行 Lua,应显式通过 KEYS 参数传入所需 Key,并确保它们同槽,避免根据数据动态拼接并访问其他槽位。客户端即使支持跨节点批量读取,也通常只是拆分请求并汇总结果,不能因此获得跨槽原子性。

同槽设计有什么代价?#

把同一订单的小范围数据放在同槽,方便进行原子操作;把所有用户都标记为 {user},则会把大量数据和流量压到同一槽,破坏分片均衡。Hash Tag 应体现需要共同操作的业务实体,而不是把整个系统强行放到一个位置。

常见追问#

两个 Key 在同一节点,可以一起执行事务吗?#

仍需检查是否同槽。节点负责多个槽,但多 Key 操作的限制不只看节点地址。

Pipeline 能绕过 CROSSSLOT 吗?#

它可以由集群客户端把独立命令发到不同节点,但不能让本来要求同槽的一条命令获得跨槽原子性。

为什么 Redis Cluster 常见只有 DB 0?#

Cluster 不支持像单节点那样切换多个逻辑数据库。业务隔离通常依靠 Key 命名或独立集群,不能靠 SELECT 把跨槽问题解决。

同槽是否代表迁移过程永远不出错?#

不是。迁移中相关 Key 可能暂时分散于源与目标节点,多 Key 请求仍可能需要重试。客户端要处理迁移状态和重定向。

Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
https://blog.xqcherry.top/posts/interview/redis/redis-cluster-hash-tags/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0