当前位置:首页 > 文章列表 > 数据库 > Redis > Redis Cluster 多键操作如何设计相同哈希槽

Redis Cluster 多键操作如何设计相同哈希槽

来源:17golang原创 2026-10-09 06:43:49 0浏览 收藏

Redis Cluster 多键操作的关键不是把 key 前缀写得一样,而是让相关 key 的“哈希标签”一致。例如把用户资料、购物车和未读数分别命名为 user:{10086}:profile、user:{10086}:cart、user:{10086}:unread,三者都会按 10086 计算槽位,才能安全用于同一次 MGET、事务或 Lua 调用。

官方地址:https://redis.io/

要点速览
  • 多键命令要求涉及的 key 位于同一个 hash slot,否则会出现 CROSSSLOT。
  • Redis Cluster 只使用第一个有效 {...} 中的内容计算槽位,空标签不会生效。
  • 标签应绑定业务聚合 ID,而不是固定写成一个值;否则多键方便了,热点也集中到一个槽。

先把 CROSSSLOT 看成数据建模问题

Redis Cluster 将 key 空间拆成 16384 个槽,普通 key 按 CRC16(key) mod 16384 计算。单键 GET、SET 只需要定位一个槽;MGET、MULTI/EXEC、涉及多个 key 的 Lua 脚本则要求这些 key 能由同一个节点处理。若 user:10086:profile 与 user:10086:cart 没有标签,它们的完整字符串通常会得到不同槽位,客户端可能直接返回 CROSSSLOT Keys in request don't hash to the same slot。

因此,先列出一次操作真正需要的 key,再决定聚合边界。不要为了让任意 key 都能一起操作而使用固定标签,例如全部写成 {all};这会把写入和读取集中到一个槽,形成热点。

Redis Cluster 多键操作中业务聚合 ID、哈希标签与同一槽位的关系说明图
图1:Redis Cluster 哈希标签结构说明图,展示业务聚合 ID 如何让多个 key 指向同一槽位。

用稳定的业务 ID 设计哈希标签

标签的内容应该是一次多键操作共同拥有的业务主键:用户 ID、订单 ID、会话 ID 都可以;不要把会变化的状态、时间戳或随机数放进标签。推荐保持“资源类型 + 标签 + 资源名”的形状,让日志和排查仍然可读:

package keys

import "strconv"

// UserKeys 统一生成同一用户聚合下的 key,保证花括号内容完全一致。
func UserKeys(userID int64) (profile, cart, unread string) {
	// 标签只放稳定业务 ID;不要把状态或时间戳放进 {}。
	tag := "{" + strconv.FormatInt(userID, 10) + "}"
	return "user:" + tag + ":profile", "user:" + tag + ":cart", "user:" + tag + ":unread"
}

这段 builder 的价值在于把规则集中在一个地方。若一个服务写成 user:{10086}:cart,另一个服务读成 user:10086:unread,哪怕人眼看起来是同一用户,也已经失去同槽保证。跨团队共享时,应把 key builder 或标签约定作为接口契约。

在发送多键请求前做同槽核对

开发环境可以用 CLUSTER KEYSLOT key 对每个候选 key 取槽位;例如三个 key 都使用 {10086} 时,返回值应一致。生产代码不必每次额外请求 Redis 查询槽位,而是在本地 builder 中保证标签来源唯一,并让集群客户端负责维护槽位路由。

设计槽位结果适用场景
user:{10086}:profile + user:{10086}:cart同槽同一用户聚合读取、事务
user:10086:profile + user:10086:cart通常不同槽只能拆成单键请求或改 key 设计
{all}:user:10086 + {all}:user:20000同槽但易热点仅适合极小、低频的控制数据

注意标签算法只取第一个有效花括号内的内容:foo{user1000}.a 与 bar{user1000}.b 同槽;空的 {} 不会触发标签规则。多个花括号也不要依赖复杂嵌套,统一约定一个简单标签最容易排查。

Redis Cluster 多键请求的同槽检查、客户端路由与热点边界说明图
图2:多键请求边界结构说明图,展示 key builder、槽位检查、客户端路由和热点监控之间的关系。

压测时同时看同槽成功率和热点

同槽只是“请求可以被同一节点处理”,不等于设计一定健康。压测至少记录三组数据:多键请求的 CROSSSLOT 数量、各 master 的请求量/CPU,以及单个标签聚合的峰值访问量。若用户级标签分布均匀,通常比固定标签更容易横向扩展;若某个超级用户需要同时读写大量 key,则应拆分聚合边界,例如按 {userID}:cart 和 {userID}:feed:0 设计多个可独立访问的分片。

扩容或 resharding 期间,槽位会迁移,客户端还要正确处理 MOVED 与 ASK。不要把业务代码写成“收到错误就重试同一个节点”;应使用支持 Redis Cluster 的客户端,让它刷新槽位映射并把请求发往正确节点。哈希标签解决的是多键共槽,不会消除迁移、故障转移或热点治理的责任。

常见问题

哈希标签一定要放在 key 的中间吗?

不需要。只要存在第一个有效的 {非空内容},标签前后的业务文字都可以不同,常见做法是把资源类型放在前面、资源名放在后面。

两个 key 看起来一样却仍然 CROSSSLOT,先查什么?

先打印最终发送给 Redis 的完整字符串,重点检查花括号是否为空、标签是否含有不同前缀,以及是否有服务使用了另一套 key builder;不要只比较业务 ID。

能不能给所有 key 使用同一个标签?

技术上可以,但会牺牲集群分布和吞吐。只有确实属于同一小型控制聚合且访问量可控时才考虑,业务数据应按用户、订单或会话等稳定聚合 ID 分散。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
MySQL 递归 CTE 怎样限制深度并检测路径环MySQL 递归 CTE 怎样限制深度并检测路径环
上一篇
MySQL 递归 CTE 怎样限制深度并检测路径环
os.Root 打开软链接为何仍可能返回边界错误
下一篇
os.Root 打开软链接为何仍可能返回边界错误
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    386次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    466次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    474次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    414次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    240次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码