【面试题】Redis 集群的实现原理是什么?

Redis集群原理:就像外卖平台的多店铺配送系统 🚚

一、整体比喻:外卖平台如何运作?

想象美团外卖平台

  • 多个餐厅:每个餐厅负责一部分菜品(数据分片)
  • 配送中心:协调订单分配(集群管理)
  • 骑手网络:互相传递信息(节点通信)
  • 备用厨房:主厨病了,副厨顶上(主从复制)

Redis集群就是这样一个"分布式外卖系统"!

二、Redis集群的核心原理

1.数据分片:每个餐厅只做自己的拿手菜🍔

/* by yours.tools - online tools website : yours.tools/zh/tripledes.html */ # Redis集群把数据分成16384个"菜品槽"(slots) # 就像把全城分成16384个配送区域 # 假设有3个餐厅(Redis节点): 节点A: 负责槽 0-5460 # 做汉堡薯条 节点B: 负责槽 5461-10922 # 做披萨意面 节点C: 负责槽 10923-16383 # 做中餐 # 用户点"宫保鸡丁" → 系统计算:hash("宫保鸡丁") % 16384 = 12000 # 12000属于中餐区 → 自动派单给节点C(中餐餐厅)

原理

  • 每个键通过CRC16算法计算哈希值
  • 对16384取模,得到槽位
  • 数据存储到负责该槽的节点

2.集群架构:餐厅联盟的三种角色👥

┌─────────────────┐ │ 客户端App │ └────────┬────────┘ │ ┌─────────────────┼─────────────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 主节点A │ │ 主节点B │ │ 主节点C │ │ (主厨) │ │ (主厨) │ │ (主厨) │ │ 槽0-5460 │ │5461-10922│ │10923-16383│ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ │ 从节点A1 │ │ 从节点B1 │ │ 从节点C1 │ │ (副厨) │ │ (副厨) │ │ (副厨) │ └─────────┘ └─────────┘ └─────────┘

节点类型

  • 主节点:存储数据,处理读写请求(主厨)
  • 从节点:复制主节点数据,只读(副厨)
  • 哨兵节点:监控节点健康(餐厅卫生监督员)

3.节点通信:餐厅经理们的微信群📱

/* by yours.tools - online tools website : yours.tools/zh/tripledes.html */ # 节点间通过Gossip协议通信(就像微信群聊) # 每个节点都知道其他节点的:槽分配、在线状态、地址 # 通信内容: 1. "我是餐厅A,负责汉堡区,我健康!" 2. "餐厅C好像掉线了?有谁联系得上?" 3. "新开了餐厅D,接手了披萨区一部分" # Gossip协议特点: # - 定期广播(每100ms) # - 最终一致性(消息慢慢传开) # - 容错性强(几个餐厅掉线不影响)

4.故障转移:主厨病了,副厨顶上🚑

场景:主节点A(汉堡主厨)突然心脏病发作(宕机)

流程

1. 从节点A1发现主厨失联:"主厨10秒没回我消息了!" 2. 向其他餐厅确认:"你们联系得上汉堡主厨吗?" 3. 多数餐厅确认失联:"我们也联系不上" 4. 选举新主厨:所有副厨投票,A1得票最多 5. A1晋升为主厨:"我来接管汉堡区!" 6. 更新微信群名片:A1改为主节点A

技术实现

# Redis哨兵(Sentinel)监控机制 1. 主观下线(SDOWN):一个哨兵认为主节点不可用 2. 客观下线(ODOWN):超过半数哨兵认为不可用 3. 选举领头哨兵:Raft算法选举 4. 故障转移:领头哨兵选择最合适的从节点升级 # Redis Cluster内置的故障检测 1. 每个节点定期ping其他节点 2. 标记疑似下线(PFAIL) 3. 广播下线信息,其他节点确认 4. 标记为已下线(FAIL) 5. 从节点开始选举

5.集群扩容:开新分店🏪

场景:生意太好,要开第四家餐厅(节点D)

流程

1. 新餐厅加入:"大家好,我是新开的日料店D" 2. 重新分配菜品槽:从A、B、C各分一些槽给D 3. 数据迁移:把对应菜品搬到新餐厅 - A把"薯条"菜谱发给D - B把"海鲜披萨"菜谱发给D - C把"麻婆豆腐"菜谱发给D 4. 迁移期间,用户点菜: - 如果菜还在老店:"稍等,正在搬到新店,去新店点" - 如果已搬到新店:"请去新店点餐"

技术命令

# 1. 添加新节点 redis-cli --cluster add-node new_host:new_port existing_host:existing_port # 2. 重新分配槽 redis-cli --cluster reshard host:port # 3. 数据迁移是同步的,迁移期间集群仍可用 # 迁移过程中,客户端可能收到ASK重定向

三、客户端如何与集群交互? 📲

场景:用户点餐流程

// 客户端(用户)想点一份"宫保鸡丁" public class RedisClient { public void orderFood() { // 1. 第一次请求,随便选个餐厅 String key = "宫保鸡丁"; JedisCluster jedis = new JedisCluster(nodes); // 连接集群 // 2. 计算槽位:hash("宫保鸡丁") % 16384 = 12000 // 3. 槽位12000属于节点C(中餐) // 4. 直接发给节点C jedis.set(key, "一份宫保鸡丁"); // 5. 如果发错餐厅(比如发给A),A会告诉你: // "MOVED 12000 节点C的地址" // 客户端自动重定向到节点C // 6. 聪明的客户端会缓存槽位映射表 // 下次直接找对的餐厅,不用重定向 } }

两种重定向:

# 1. MOVED重定向(永久重定向) # 就像:"这道菜不是我们做的,你永远去中餐厅点" 客户端→节点A: 我要"宫保鸡丁" 节点A→客户端: MOVED 12000 节点C地址 客户端→节点C: 我要"宫保鸡丁" 节点C→客户端: 好的,给你做 # 2. ASK重定向(临时重定向) # 发生在数据迁移时 # 就像:"这道菜正在从我们店搬到新店,你去新店看看" 客户端→节点A: 我要"薯条" 节点A→客户端: ASK 新节点地址 # 槽500正在迁移 客户端→新节点: ASKING命令 # 先打个招呼 客户端→新节点: 我要"薯条" 新节点→客户端: 好的,我们刚接手这道菜

四、集群的限制:不是万能的 🚧

1.不支持跨节点事务

# 事务要求所有键在同一个节点 # 就像:不能同时点汉堡店的汉堡和中餐厅的宫保鸡丁在一个订单里 # ❌ 错误做法(键在不同节点) MULTI SET key1 value1 # key1在节点A SET key2 value2 # key2在节点B EXEC # 会失败! # ✅ 正确做法:使用哈希标签 # 用{}确保两个键在同一个槽 MULTI SET user:{1000}:name "张三" # 都在user:1000相关槽 SET user:{1000}:age 25 # {}内内容决定槽 EXEC

2.批量操作限制

# mget/mset只能用于同一个节点上的键 # 就像:不能一次从汉堡店和中餐厅同时取餐 # ❌ 可能失败 MGET key1 key2 key3 # 如果key1、key2、key3在不同节点 # ✅ 解决方案 # 1. 使用哈希标签 # 2. 客户端分组发送 # 3. 使用Pipeline分别发送

3.Lua脚本限制

# Lua脚本中的所有键必须在同一个节点 # 就像:脚本厨师不能同时用汉堡店和中餐厅的厨房 # 脚本示例(必须所有键在同一个槽) EVAL "return redis.call('GET', KEYS[1])" 1 user:{1000}:name

五、集群搭建实战:开个小型外卖平台 🛠️

1.最少6个节点配置(3主3从)

# 目录结构 redis-cluster/ ├── node-7000/ # 主节点1 ├── node-7001/ # 主节点2 ├── node-7002/ # 主节点3 ├── node-7003/ # 从节点1(复制7000) ├── node-7004/ # 从节点2(复制7001) └── node-7005/ # 从节点3(复制7002) # 每个节点的redis.conf port 7000 cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000 appendonly yes

2.一键创建集群

# Redis 5.0+ 使用redis-cli创建 redis-cli --cluster create \ 127.0.0.1:7000 \ 127.0.0.1:7001 \ 127.0.0.1:7002 \ 127.0.0.1:7003 \ 127.0.0.1:7004 \ 127.0.0.1:7005 \ --cluster-replicas 1 # 每个主节点配1个从节点

3.查看集群状态

# 查看集群信息 redis-cli -p 7000 cluster info # 查看节点信息 redis-cli -p 7000 cluster nodes # 查看槽分配 redis-cli -p 7000 cluster slots

4.集群健康检查

# 检查集群状态 redis-cli --cluster check 127.0.0.1:7000 # 输出示例: [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. # 所有槽都有节点负责

六、集群 vs 哨兵 vs 主从:三种外卖模式对比 🍽️

模式比喻优点缺点适用场景
主从复制一家餐厅+一个备用厨房简单、读写分离主节点单点故障小餐厅,可接受短暂停业
哨兵模式餐厅+备用厨房+卫生监督员自动故障转移写操作单点、扩容麻烦中等餐厅,需要高可用
集群模式多个餐厅联盟高可用、高并发、易扩容实现复杂、客户端需支持大型连锁餐厅,海量订单

七、集群常见问题与解决方案 🚨

1.脑裂问题(Split Brain)

# 场景:网络分区,形成两个"外卖平台" # 节点A、B在一个网络,C、D在另一个网络 # 两边都认为自己是"正宗平台" # 解决方案:多数派原则 # 集群需要至少3个主节点,故障容忍度 = (N-1)/2 # 3主节点:允许1个节点故障 # 5主节点:允许2个节点故障

2.数据一致性

# Redis集群采用异步复制 # 主节点写成功就返回,然后异步复制到从节点 # 可能丢失少量数据(主节点宕机前未同步的数据) # 解决方案(根据业务选择): # 1. 等待复制:WAIT命令,等待N个从节点确认 # 2. 强一致性:用Redlock等算法,但性能下降 # 3. 最终一致性:接受短暂不一致,多数业务够用

3.热点Key问题

# 场景:某个商品突然爆单(如iPhone新品) # 所有请求都打到同一个节点,造成压力 # 解决方案: # 1. 本地缓存:客户端缓存热点数据 # 2. 拆分Key:iphone:13:stock → iphone:13:stock:1、iphone:13:stock:2 # 3. 限流降级:对热点请求限流

4.集群扩容时的性能问题

# 迁移大量数据时,网络和磁盘IO压力大 # 客户端频繁收到ASK重定向 # 解决方案: # 1. 业务低峰期迁移 # 2. 分批迁移,控制迁移速度 # 3. 使用专业的迁移工具

八、Redis集群最佳实践 📚

1.合理规划节点数

# 推荐配置:至少3主3从,最多1000个节点 # 主节点数最好是奇数(选举时避免平票) # 每个主节点的从节点不超过2个(太多复制影响性能) # 生产环境建议: # 小规模:3主3从(可承受1主+1从同时故障) # 中规模:5主5从(可承受2主+2从同时故障) # 大规模:按业务分集群,不要一个集群太大

2.监控指标

# 关键监控项: 1. 集群状态:cluster_state:ok? 2. 槽覆盖率:16384个槽是否全部分配 3. 节点健康:主从节点是否在线 4. 内存使用:避免单个节点内存过大 5. 网络流量:节点间通信是否正常 6. 命中率:缓存命中率是否正常

3.客户端使用规范

public class RedisClusterBestPractice { // 1. 使用连接池 private JedisCluster jedisCluster; public void init() { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); config.setMaxIdle(20); Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("127.0.0.1", 7000)); // ... 添加所有节点 // 2. 设置合理的超时时间 jedisCluster = new JedisCluster(nodes, 2000, // 连接超时 2000, // 读取超时 3, // 重试次数 config); } // 3. 使用Pipeline批量操作(相同节点) public void batchSetSameSlot() { String slotTag = "{user:1000}"; // 使用哈希标签 Pipeline p = jedisCluster.pipelined(); p.set(slotTag + ":name", "张三"); p.set(slotTag + ":age", "25"); p.sync(); } }

九、一张图总结Redis集群 🗺️

┌─────────────────────────────────────┐ │ Redis集群:外卖平台联盟 │ └────────────────┬────────────────────┘ │ ┌─────────────────────────┼─────────────────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 汉堡餐厅 │ │ 披萨餐厅 │ │ 中餐厅 │ │ (主节点A) │ │ (主节点B) │ │ (主节点C) │ │ 槽0-5460 │ │ 5461-10922 │ │ 10923-16383 │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ 微信群聊(Gossip) │ │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 备用厨房 │ │ 备用厨房 │ │ 备用厨房 │ │ (从节点A1) │ │ (从节点B1) │ │ (从节点C1) │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └────────────────────────┼────────────────────────┘ │ ┌────────────────▼────────────────┐ │ 客户端(用户) │ │ 自动路由 + 缓存槽位映射 │ └──────────────────────────────────┘

十、一句话总结

Redis集群 = 数据分片(16384槽)+ 主从复制(高可用)+ Gossip通信(自管理)

记住口诀:"一六三八四槽分,三主三从起步稳,Gossip协议传消息,故障转移自动跟,客户端需知槽映射,哈希标签保同门。"

❤️ 如果你喜欢这篇文章,请点赞支持! 👍 同时欢迎关注我的博客,获取更多精彩内容!

本文来自博客园,作者:佛祖让我来巡山,转载请注明原文链接:https://www.cnblogs.com/sun-10387834/p/19457309

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1129549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

32.useClickOutside

React useClickOutside 钩子:如何优雅地处理组件外部点击事件? 在 React 应用开发中,处理组件外部的点击事件是一个常见需求,特别是在实现下拉菜单、模态框或自定义弹出框等交互组件时。useClickOutside 钩子提供了一种简洁而有效的方式来检测和响应发生在指定组件外部的点…

M2FP模型模型压缩技术:减小体积保持精度

M2FP模型压缩技术&#xff1a;减小体积保持精度 &#x1f9e9; M2FP 多人人体解析服务概述 在当前计算机视觉领域&#xff0c;多人人体解析&#xff08;Multi-person Human Parsing&#xff09;正成为智能交互、虚拟试衣、安防监控等场景的核心技术之一。M2FP&#xff08;Mask2…

M2FP错误码说明:常见HTTP返回值及其解决方法

M2FP错误码说明&#xff1a;常见HTTP返回值及其解决方法 &#x1f9e9; M2FP 多人人体解析服务 M2FP&#xff08;Mask2Former-Parsing&#xff09;是一项基于深度学习的多人人体语义分割服务&#xff0c;专为复杂场景下的精细化人体部位识别而设计。该服务不仅支持对图像中多个…

基于java+ vue学生求职就业系统(源码+数据库+文档)

学生求职就业 目录 基于springboot vue学生求职就业系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue学生求职就业系统 一、前言 博主介绍&…

M2FP部署避坑指南:PyTorch版本冲突问题已彻底解决

M2FP部署避坑指南&#xff1a;PyTorch版本冲突问题已彻底解决 &#x1f4d6; 项目简介&#xff1a;M2FP 多人人体解析服务 (WebUI API) 在计算机视觉领域&#xff0c;多人人体解析&#xff08;Multi-person Human Parsing&#xff09; 是一项极具挑战性的任务&#xff0c;要求…

33.useClickInside

React useClickInside 钩子:如何优雅地处理组件内部点击事件? 在 React 应用开发中,有时需要统一处理组件内部的点击事件,特别是当组件包含多个子元素,而你不想为每个子元素单独添加 onClick 处理器时。useClickInside 钩子提供了一种简洁而有效的方式来检测和响应发生在…

生物毒性检测仪:原理、演进与综合应用价值深度解析

摘要&#xff1a;本文从水质综合安全评估的实际需求出发&#xff0c;系统阐述了生物毒性检测技术的重要性。文章深入剖析了以发光细菌法为代表的现代生物毒性检测仪的核心原理&#xff0c;对比了其相较于传统生物测试方法的技术优势。结合行业具体痛点&#xff0c;详细论述了现…

M2FP模型边缘计算部署:低功耗设备运行方案

M2FP模型边缘计算部署&#xff1a;低功耗设备运行方案 &#x1f9e9; M2FP 多人人体解析服务概述 在智能安防、虚拟试衣、人机交互等应用场景中&#xff0c;多人人体解析&#xff08;Multi-person Human Parsing&#xff09; 正成为一项关键的视觉理解能力。传统语义分割模型往…

MGeo可视化:地址匹配决策过程的可解释性分析

MGeo可视化&#xff1a;地址匹配决策过程的可解释性分析 在地址数据处理和地理信息系统中&#xff0c;MGeo作为多模态地理语言模型&#xff0c;能够高效判断两条地址是否指向同一地理实体&#xff08;如道路、村庄、POI等&#xff09;。然而&#xff0c;当监管机构要求AI系统提…

Z-Image-Turbo情绪映射:快乐、悲伤、愤怒的色彩表达

Z-Image-Turbo情绪映射&#xff1a;快乐、悲伤、愤怒的色彩表达 情绪驱动图像生成的技术背景与创新价值 在AI艺术创作领域&#xff0c;图像不再仅仅是视觉内容的输出&#xff0c;更成为情感表达的载体。阿里通义实验室推出的Z-Image-Turbo WebUI&#xff0c;作为一款基于扩散…

34.useHash

React useHash 钩子:如何优雅地管理浏览器 URL 哈希值? 在单页应用(SPA)开发中,管理和响应 URL 哈希值的变化是一个常见需求,特别是在实现简单路由或页面内导航时。useHash 钩子提供了一种简洁而有效的方式来监听和更新浏览器的 URL 哈希值,使得在 React 组件中处理哈希…

M2FP模型在动作识别中的扩展应用

M2FP模型在动作识别中的扩展应用 &#x1f9e9; M2FP 多人人体解析服务&#xff1a;从语义分割到行为理解的桥梁 在计算机视觉领域&#xff0c;动作识别&#xff08;Action Recognition&#xff09;长期面临一个关键挑战&#xff1a;如何在复杂场景中精准定位并区分多个个体的身…

从Demo到上线:某初创公司使用M2FP构建SaaS化解析服务经历

从Demo到上线&#xff1a;某初创公司使用M2FP构建SaaS化解析服务经历 &#x1f310; 项目背景与业务挑战 在虚拟试衣、智能健身指导、数字人内容生成等新兴场景中&#xff0c;高精度的人体语义分割成为关键基础设施。某初创团队计划打造一款面向C端开发者和中小企业的SaaS化“多…

多场景AI落地:教育、电商、外贸领域的翻译镜像应用

多场景AI落地&#xff1a;教育、电商、外贸领域的翻译镜像应用 &#x1f310; AI 智能中英翻译服务 (WebUI API) &#x1f4d6; 项目简介 本镜像基于 ModelScope 的 CSANMT (神经网络翻译) 模型构建&#xff0c;专为高质量中文到英文翻译任务设计。相比传统统计机器翻译&#…

模型更新策略:无缝升级M2FP服务版本

模型更新策略&#xff1a;无缝升级M2FP服务版本 &#x1f4d6; 项目背景与核心挑战 在AI模型服务的生命周期中&#xff0c;模型迭代是常态。以 M2FP&#xff08;Mask2Former-Parsing&#xff09;多人人体解析服务为例&#xff0c;随着新数据集的引入、训练策略的优化以及骨干网…

三维地质建模数据处理高级实践技术应用

三维地质建模计算在地质工程、地球物理、矿产勘查等领域获得了广泛的应用&#xff0c;常用软件包括GOCAD、Surpac、XModel、DMine等。通过三维地质建模&#xff0c;既可以表达空间几何对象&#xff0c;也可以表现空间属性分布&#xff0c;进而实现地下三维空间可视化、地质解释…

西门子SITOP电源 6EP4137-3AB00-1AY0

西门子SITOP电源模块 6EP4137-3AB00-1AY0 技术详解一、产品概述西门子SITOP PSU300系列电源模块&#xff08;型号&#xff1a;6EP4137-3AB00-1AY0&#xff09;是一款工业级高性能开关电源&#xff0c;专为自动化控制系统设计。其额定输出为24V DC/40A&#xff0c;采用紧凑型金属…

从组装工到超级个体:AI伴侣开发中的工具整合与体验优化

思考与发现在AI时代&#xff0c;开发者正扮演着“组装工”的角色&#xff0c;将各种开源工具和技术整合成满足个人或特定需求的解决方案。开发“凤希AI伴侣”的核心目标&#xff0c;正是打造一套能用于内容创作&#xff08;文章、图片、视频&#xff09;的本地化、低成本工具集…

导师推荐2026最新!9款一键生成论文工具测评:本科生毕业论文必备

导师推荐2026最新&#xff01;9款一键生成论文工具测评&#xff1a;本科生毕业论文必备 2026年学术写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着AI技术的快速发展&#xff0c;越来越多的本科生开始依赖智能写作工具来提升论文写作效率。然而&#xff0c;面对…

人体解析为何选M2FP?支持20+身体部位,颜色自动映射

人体解析为何选M2FP&#xff1f;支持20身体部位&#xff0c;颜色自动映射 &#x1f4cc; 多人人体解析的技术挑战与M2FP的破局之道 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项比通用语义分割更精细、更具挑战性的任务。它要求模型不仅…