当前位置: 首页 > article >正文

Redis分片集群散列插槽

一、前言为什么 Redis Cluster 用 16384 个槽在 Redis 分片集群Cluster中数据不是随机分布而是通过“散列插槽”Hash Slot机制进行分片。你可能好奇为什么是16384个槽不是 65536 或 1024key 是如何映射到具体节点的为什么MGET user:1 user:2有时会报错本文将带你彻底搞懂 Redis 散列插槽的设计哲学与工作原理。二、散列插槽Redis Cluster 的分片基石2.1 基本概念Redis Cluster 将整个 key 空间划分为16384 个哈希槽slot每个 key 通过公式计算归属哪个 slotslot CRC16(key) % 16384每个 master 节点负责一部分连续或不连续的 slot✅优势分片规则简单、确定扩容/缩容只需迁移 slot无需 rehash 全量数据三、为什么是 16384不是更多或更少这是 Redis 作者Salvatore Sanfilippoantirez在 GitHub issue 中亲自解释的经典问题。3.1 官方理由精简版“16384 is the right balance between:消息大小每个节点每秒通过 gossip 协议广播 cluster state集群规模最多支持 1000 个节点实际建议 ≤ 100内存开销每个 slot 状态需 2 字节16384 × 2 32KB”3.2 详细分析槽位数每节点心跳包大小支持最大节点数内存开销65536~130KB 100128KB16384~32KB~100032KB4096~8KB 10008KB65536 太大心跳包过大网络带宽浪费4096 太小节点多时slot 分配不均如 100 节点平均仅 40 个 slot/节点16384 刚好兼顾扩展性与效率结论16384 是工程上的最优折中。四、Key 到 Slot 的计算过程含代码4.1 CRC16 算法Redis 使用CRC16_CCITT变种初始值 0无反转。4.2 Java 实现示例public class RedisSlot { private static final int SLOT_COUNT 16384; public static int getSlot(String key) { // 1. 提取 Hash Tag如有 String tagKey extractTag(key); // 2. 计算 CRC16 int crc crc16(tagKey.getBytes(StandardCharsets.UTF_8)); // 3. 取模 return crc % SLOT_COUNT; } // 支持 Hash Tag{user1001}.name 和 {user1001}.age 落在同一 slot private static String extractTag(String key) { int start key.indexOf({); if (start ! -1) { int end key.indexOf(}, start 1); if (end ! -1 end ! start 1) { return key.substring(start 1, end); } } return key; } // 简化版 CRC16实际应使用标准实现 private static int crc16(byte[] bytes) { int crc 0; for (byte b : bytes) { crc ((crc 8) ^ LOOKUP_TABLE[((crc 8) ^ (b 0xFF)) 0xFF]) 0xFFFF; } return crc; } private static final int[] LOOKUP_TABLE { /* CRC16 表 */ }; }✅关键点Hash Tag可强制多个 key 落在同一 slot五、客户端如何定位 Key 所在节点当客户端访问一个 key 时流程如下5.1 首次访问无本地缓存随机连接一个节点如 7001节点计算 key 的 slot发现不在自己负责范围返回MOVED 重定向MOVED 5461 192.168.1.10:7002客户端缓存slot - node映射并重连 70025.2 后续访问有缓存直接根据 slot 路由到目标节点无重定向Lettuce / Jedis Cluster 客户端会自动处理 MOVED/ASK六、跨 Slot 操作为何失败6.1 问题场景# 假设 user:1 → slot 1000, user:2 → slot 2000 redis-cli -c MGET user:1 user:2 # 报错CROSSSLOT Keys in request dont hash to the same slot6.2 原因Redis Cluster要求多 key 操作必须在同一 slot否则无法保证原子性和一致性6.3 解决方案使用 Hash Tag# 强制 user:1 和 user:2 落在同一 slot MGET {user100}.name {user100}.age # OK{}内的内容作为 hash keyuser100相同 → slot 相同✅最佳实践对需要 multi-key 操作的数据使用相同 Hash Tag七、Slot 迁移与集群扩容当新增 master 节点时需迁移部分 slot7.1 迁移流程目标节点声明“我将接管 slot X”源节点进入MIGRATING状态客户端访问 slot X 的 key若 key 存在 → 返回ASK 重定向到目标节点若 key 不存在 → 允许在目标节点写入源节点逐步迁移 keyCLUSTER GETKEYSINSLOTMIGRATE迁移完成更新集群拓扑7.2 客户端感知收到ASK时先发 ASKING 命令再发原命令Lettuce/Jedis 自动处理业务无感八、监控与运维命令8.1 查看 slot 分配redis-cli -p 7001 CLUSTER SLOTS # 返回[[0,5460,192.168.1.10,7001], [5461,10922,192.168.1.10,7002], ...]8.2 查看 key 所属 slotredis-cli -p 7001 CLUSTER KEYSLOT user:1001 # 返回54618.3 查看节点负责的 slotsredis-cli -p 7001 CLUSTER NODES # 输出中connected 0-5460九、结语感谢您的阅读如果你有任何疑问或想要分享的经验请在评论区留言交流

相关文章:

Redis分片集群散列插槽

一、前言:为什么 Redis Cluster 用 16384 个槽?在 Redis 分片集群(Cluster)中,数据不是随机分布,而是通过“散列插槽”(Hash Slot)机制进行分片。 你可能好奇:为什么是 1…...

大模型和芯片工程师都会犯错——凭什么用零缺陷标准要求前者?

跨时钟域漏处理、验证约束文件过约束了——这些问题在流片前几乎每个项目都会遇到。没有人会因为工程师犯了这些错误就说"这个人不能用"。那为什么大模型一旦出错,就有人开始质疑它的价值?这个双重标准值得认真想一想。现在很多团队在用大模型…...

投研人如何养“虾“?

扫描下载文档详情页: https://www.didaidea.com/wenku/16586.html...

NumPy:ndarray 数组属性

在使用 NumPy 进行科学计算或数据分析时,数组对象不仅存储数据本身,还包含描述数组结构与内存布局的信息,这些信息被称为数组属性(array attributes)。通过这些属性,我们可以了解数组的维度结构、元素数量、…...

WinClaw CLI 工具开发指南

你可以给 AI 一个工具。但更好的做法是:告诉它怎么发现工具、怎么理解工具、怎么组合工具。 WinClaw 的 CLI 工具体系,就是为此而设计的。一、AI 时代,工具开发的逻辑变了过去做 CLI 工具,用户是人。帮助文档写给人看,…...

Debian/Ubuntu 18.04 上安装 GLIBC 2.28 (2026)

Ubuntu 18.04 上安装 GLIBC 2.28 (2026) 引言 某些现代软件(例如 Visual Studio Code Server 1.88 及更新版本)要求系统 GLIBC 版本不低于 2.28,而 Ubuntu 18.04 默认提供的是 GLIBC 2.27。直接升级系统级 GLIBC 可能导…...

在Linux x86_64系统中编译mission

以下在ubuntu18.10 gcc8.3编译通过。安装编译工具:sudo apt install build-essential sudo apt install cmake重命名以下目录中的wsf_module为wsf_module-(子目录的不用管)以屏蔽图形界面相关的模块:swdev/src/engage swdev/src/…...

黑客与画家的品牌时代主动式Agent时代的品牌#The Brand Age

主动式 Agent 时代的品牌Paul Graham 在《品牌时代》(The Brand Age)中复盘了瑞士钟表业如何从“精准计时”的黄金时代,转型为“身份象征”的品牌时代。他提出了一个冷峻的定义:当产品之间的实质性差异消失时,品牌就是…...

告别OSPF!EVE-NG专业版+BGP Unnumbered打通Underlay的完整实战

吃一堑,长一智。有了前面的经验教训(ECN配置折戟记:vEOS模拟器局限性深度剖析),我们这次在换镜像的时候,提前把后面实验用到的命令先验证一下(从屡战屡败到一气呵成:EVE-NG专业版 C…...

威拉里发布多款金属3D打印新材料!三期项目与国外工厂全力推进!

当前,3D打印正迈入规模化生产新阶段,金属粉末的品质一致性与供应稳定性,直接决定了规模化生产的可行性与经济性。近日,国内3D打印金属粉末领域的龙头企业威拉里,接连发布多款针对不同高端制造领域的新型金属粉末材料&a…...

深入理解 Dify 插件守护进程:从加载到执行的完整链路

❝本文深入剖析 Dify 插件系统的核心机制,揭秘插件守护进程如何加载、启动和执行插件代码,以及参数传递的完整链路。❞一、前言Dify 作为一款开源的 LLM 应用开发平台,其插件系统是扩展平台能力的核心机制。很多开发者在阅读源码时会产生疑问…...

探索大数据领域Flink的CEP复杂事件处理

探索大数据领域Flink的CEP复杂事件处理 Keywords: Apache Flink, Complex Event Processing (CEP), 大数据实时分析, 事件流, 模式检测, 状态机, 实时报警系统 Summary: 本文将带您深入探索Apache Flink中的复杂事件处理(CEP)技术,一种在大数…...

当SSD退役时必做的5件事:基于NVMe Sanitize的完整数据销毁流程

NVMe SSD退役数据销毁全指南:从Sanitize操作到二手处置 当企业级NVMe SSD面临退役时,数据安全销毁是技术团队必须严肃对待的环节。一块未经妥善处理的存储设备,即使被标记为"已删除",仍可能通过专业工具恢复敏感数据。本…...

4步突破:Cursor无限制使用完全指南

4步突破:Cursor无限制使用完全指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We have this limit in…...

问题解决方法:keil软件用st-link烧录代码报错

问题:今天用st-link烧录代码报错说芯片和识别的芯片不一样?难道是盗版?解决方法:把这个使能引脚取消就可以成功烧录了...

SQL Server查看数据库中每张表的数据量和总数据量

查询将返回每个表的名称和表中的数据行数(RowCounts),并按数据量从大到小排序 -- 查询数据库中每张表的行数(数据量) SELECT t.name AS TableName, -- 表的名称SUM(p.rows) AS RowCounts -- 表中所有分区的行数之和…...

GME-Qwen2-VL-2B辅助AE视频制作:智能生成视频片段描述与标签

GME-Qwen2-VL-2B辅助AE视频制作:智能生成视频片段描述与标签 1. 引言 如果你经常用After Effects做视频,肯定遇到过这样的场景:项目文件夹里塞满了各种素材片段,时间线拉得老长,想找一个特定镜头或者回忆某个片段的用…...

MATLAB麦克风实时采集与波形显示:两种方法对比与性能优化

MATLAB麦克风实时采集与波形显示:两种方法对比与性能优化 在音频信号处理领域,实时采集与可视化是许多应用的基础环节。无论是语音识别系统开发、环境噪声监测,还是音乐分析工具构建,快速准确地获取声音波形并实时显示都是关键的第…...

Phi-3-mini-4k-instruct Ollama镜像免配置教程:零基础快速上手文本生成

Phi-3-mini-4k-instruct Ollama镜像免配置教程:零基础快速上手文本生成 你是不是也想体验最新的人工智能文本生成,但被复杂的安装配置劝退了?今天我要介绍的Phi-3-mini-4k-instruct镜像,让你完全跳过所有技术门槛,直接…...

VideoAgentTrek Screen Filter 与数据库联动:构建可查询的屏幕内容审计系统

VideoAgentTrek Screen Filter 与数据库联动:构建可查询的屏幕内容审计系统 你有没有遇到过这样的场景?在金融交易、远程运维或者政务审批这类关键操作中,需要对电脑屏幕上的所有活动进行记录和审计。传统的录屏方式虽然能记录画面&#xff…...

提升JMeter测试效率:WebSocket插件与5个必备插件的安装指南

提升JMeter测试效率:WebSocket插件与5个必备插件的安装指南 在性能测试领域,JMeter因其开源、可扩展的特性成为工程师的首选工具。但原生功能往往难以满足复杂场景需求,这正是插件生态大显身手的地方。本文将带您深入WebSocket测试的核心配置…...

Qwen3.5-35B-A3B-AWQ-4bit Web界面使用教程:上传控件+输入框+响应流式输出详解

Qwen3.5-35B-A3B-AWQ-4bit Web界面使用教程:上传控件输入框响应流式输出详解 你是不是也遇到过这样的场景:手里有一张图片,想快速知道里面有什么,或者想针对图片内容问几个问题,但不知道用什么工具?今天&a…...

Chord视觉定位模型实战:一句话让AI在图片里找到目标,新手3步搞定

Chord视觉定位模型实战:一句话让AI在图片里找到目标,新手3步搞定 1. 什么是Chord视觉定位模型? Chord是基于Qwen2.5-VL多模态大模型的视觉定位服务,它能理解自然语言描述并在图像中精确定位目标对象。想象一下,你只需…...

探索LD2410:实现精准人体存在检测的创新方法

探索LD2410:实现精准人体存在检测的创新方法 【免费下载链接】ld2410 An Arduino library for the Hi-Link LD2410 24Ghz FMCW radar sensor. 项目地址: https://gitcode.com/gh_mirrors/ld/ld2410 副标题:掌握24GHz雷达传感器的技术原理与实践应…...

Python结合Cartopy实现地形晕染图的进阶技巧与实战应用

1. 为什么需要地形晕染图? 地形晕染图(Shaded Relief Map)是地理信息可视化中常用的技术手段。我第一次接触这个概念是在做一个气象数据分析项目时,当时需要展示台风路径与海底地形的关系。普通的等高线图虽然能显示海拔变化&…...

开源工具突破Cursor设备限制:跨平台解决方案全解析

开源工具突破Cursor设备限制:跨平台解决方案全解析 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We hav…...

Transformer在医学图像分割中的进化史:从UNet到CSWin-UNet

Transformer在医学图像分割中的进化史:从UNet到CSWin-UNet 医学图像分割技术正经历一场由Transformer架构引领的范式转移。当放射科医生需要从CT扫描中精确勾勒肿瘤边界,或是研究人员试图量化心脏MRI中的心室容积时,他们依赖的算法核心已从传…...

SUNFLOWER MATCH LAB 模型压缩实战:使用PyTorch进行知识蒸馏

SUNFLOWER MATCH LAB 模型压缩实战:使用PyTorch进行知识蒸馏 最近在做一个移动端的图像匹配项目,用上了SUNFLOWER MATCH LAB这个模型,效果确实不错,匹配精度很高。但问题也来了,这模型有点“胖”,部署到手…...

春联生成模型-中文-base实战:输入‘幸福‘、‘平安‘,AI自动创作完整春联

春联生成模型-中文-base实战:输入幸福、平安,AI自动创作完整春联 1. 项目介绍与核心功能 春节贴春联是中国传统文化的重要组成部分,但创作一副对仗工整、寓意吉祥的春联并不容易。春联生成模型-中文-base正是为解决这个问题而开发的AI应用。…...

万象熔炉 | Anything XL效果展示:同一提示词在不同分辨率下的构图变化

万象熔炉 | Anything XL效果展示:同一提示词在不同分辨率下的构图变化 1. 工具简介与核心特点 万象熔炉 | Anything XL 是一款基于Stable Diffusion XL框架开发的本地图像生成工具,专门针对二次元和通用风格图像生成进行了深度优化。这个工具最大的特点…...