吃透哈希槽:Redis集群核心分片机制,从原理到实战避坑

news2026/4/1 2:05:58
在分布式Redis集群中“数据如何均匀分片、节点如何高效协同”是核心难题。上一篇我们详解了一致性哈希它通过环形结构解决了传统哈希的节点迁移痛点但在Redis集群的实际落地中官方并没有采用一致性哈希而是选择了更易管理、更高效的哈希槽Hash Slot机制。很多开发者混淆了哈希槽与一致性哈希甚至误以为两者是同一概念——哈希槽到底是什么它和一致性哈希有何区别为什么Redis集群非要用它实际项目中如何基于哈希槽实现数据分片、节点扩容本文将延续“通俗类比原理拆解实战操作面试高频”的风格从基础到进阶全方位拆解哈希槽既讲清底层逻辑也给出可落地的实战技巧让你不仅能看懂Redis集群的分片原理更能在项目中灵活运用、面试中从容应答真正吃透哈希槽的核心价值。无论你是刚接触分布式Redis的新手还是需要开发Redis集群、应对面试的开发者都能从本文中获取实用知识做到“懂原理、会操作、能面试、善避坑”。一、什么是哈希槽核心定义与通俗类比哈希槽Hash Slot是Redis集群用于数据分片和节点负载均衡的核心机制——它将整个Redis数据空间划分为固定数量的“槽位”每个槽位对应一部分数据再将这些槽位分配给集群中的不同节点节点通过管理自己负责的槽位实现数据的分布式存储和访问。哈希槽的核心特点是“固定槽位、灵活分配”它提前定义好固定数量的槽位Redis默认16384个数据通过哈希计算映射到具体槽位再由槽位映射到节点从而实现数据与节点的解耦让节点扩容、缩容更简单。1.1 通俗类比小区快递驿站的分区管理用一个生活化的类比快速理解哈希槽的核心逻辑对比一致性哈希更易区分两者差异一致性哈希环形分配小区有3个快递柜快递按单号哈希后顺时针找最近的快递柜存放新增/删除快递柜时仅调整相邻快递的分配哈希槽分区分配小区划分16384个“快递分区”对应哈希槽每个分区编号从0到163833个快递驿站对应Redis节点分别负责一部分分区比如驿站A负责0-5460驿站B负责5461-10922驿站C负责10923-16383快递数据按单号哈希后确定属于哪个分区再送到对应驿站新增/删除驿站时只需调整分区的归属无需变动其他分区的快递。简单来说哈希槽的核心智慧就是“先分区、再分配”它将数据空间拆分为固定的槽位用槽位作为数据与节点的中间层实现“数据归槽、槽归节点”从而让节点管理和数据迁移更可控、更高效——这也是Redis集群选择它的核心原因。1.2 核心概念哈希槽、数据映射、节点分配哈希槽的灵魂哈希槽的执行离不开三个核心概念缺一不可也是理解其与一致性哈希差异的关键哈希槽Redis集群默认将数据空间划分为16384个槽位编号0~16383这个数量是固定的可配置但不建议修改每个槽位对应一个唯一的编号负责存储一部分数据数据映射将数据的key通过哈希函数计算得到一个哈希值再对16384取模最终得到该数据对应的槽位编号公式槽位编号 CRC16(key) % 16384节点分配将16384个槽位按需分配给集群中的每个Redis节点每个节点负责管理一部分槽位可多可少节点之间通过 gossip 协议同步槽位分配信息确保客户端能找到数据所在的节点。补充说明哈希槽的本质是“数据分片的中间层”它通过固定槽位数量将“数据-节点”的直接映射转化为“数据-槽位-节点”的间接映射从而解决了一致性哈希中“节点变动时槽位分布不可控”的问题让集群管理更简单。1.3 核心优势为什么Redis集群非要用哈希槽对比一致性哈希哈希槽在Redis集群场景下的优势更突出这也是官方放弃一致性哈希、选择哈希槽的核心原因主要有4点管理更简单固定16384个槽位节点扩容/缩容时只需迁移槽位而非数据槽位归属清晰无需担心节点哈希值分布不均负载更可控可手动调整槽位分配让高性能节点负责更多槽位低性能节点负责更少槽位避免一致性哈希中“虚拟节点过多导致的管理混乱”数据迁移更高效节点变动时仅迁移需要调整的槽位对应的数据迁移范围明确且Redis集群提供自动槽位迁移工具无需手动干预兼容性更强适配Redis集群的高可用机制主从复制、哨兵主节点故障时从节点切换为主节点后直接接管原主节点的槽位数据访问不中断。二、哈希槽的执行流程一步一步拆解必懂掌握了核心概念后我们结合Redis集群的实际场景拆解哈希槽的完整执行流程从数据存储到节点扩容每一步逻辑都清晰可懂后续实战操作也能直接对应流程。2.1 前提假设Redis集群场景为了方便理解我们设定一个简单的Redis集群规则如下集群中有3个Redis主节点节点A、节点B、节点C每个主节点有1个从节点用于高可用Redis默认16384个哈希槽槽位分配节点A负责0~54605461个槽节点B负责5461~109225462个槽节点C负责10923~163835462个槽数据映射规则通过CRC16哈希函数计算key的哈希值再对16384取模得到槽位编号再根据槽位归属找到对应的主节点后续将模拟“新增节点”“节点故障”两种场景观察槽位迁移和数据访问情况。2.2 完整执行流程图文逻辑初始化分配槽位启动集群启动3个Redis主节点通过redis-cli命令创建集群指定每个节点负责的槽位范围节点之间通过gossip协议同步槽位分配信息每个节点都知道“哪个槽位属于哪个节点”初始化完成16384个槽位全部分配完毕集群处于可用状态等待数据存储。数据存储key→槽位→节点客户端发送数据存储请求如SET user:1001 zhangsanRedis客户端或集群节点计算key的槽位CRC16(user:1001) % 16384 2000假设根据槽位归属2000属于节点A0~5460客户端将请求发送到节点A节点A存储该数据并同步到自己的从节点完成数据存储。数据读取key→槽位→节点客户端发送数据读取请求如GET user:1001同样计算key的槽位为2000确定归属节点A客户端将请求发送到节点A节点A返回数据若节点A故障从节点切换为主节点返回数据。节点变动新增节点迁移槽位新增节点D主节点通过redis-cli命令将节点D加入集群从节点A、B、C中各迁移一部分槽位到节点D比如从A迁移1000~2000槽位从B迁移6000~7000槽位从C迁移12000~13000槽位槽位迁移过程中数据同步到节点D迁移完成后集群同步槽位分配信息后续新增数据若槽位属于1000~2000、6000~7000、12000~13000自动分配到节点D其他数据归属不变。节点故障主从切换接管槽位节点A故障其从节点A1检测到主节点故障通过哨兵机制或集群自动故障转移切换为主节点节点A1接管节点A原来负责的0~5460槽位集群同步槽位归属信息客户端请求0~5460槽位的数据时自动发送到节点A1数据访问不中断。2.3 关键细节避坑重点槽位数量固定Redis默认16384个槽位这个数量是经过优化的——太多会增加节点间槽位同步的开销太少会导致槽位数据量不均16384个既能保证负载均衡又能降低同步开销哈希函数选择Redis采用CRC16哈希函数16位哈希计算速度快且哈希值分布均匀避免槽位数据倾斜槽位迁移注意槽位迁移时Redis会先将源节点的槽位数据同步到目标节点同步完成后再修改槽位归属确保数据不丢失、访问不中断主从节点槽位一致从节点不负责独立的槽位而是同步主节点的槽位和数据主节点故障时从节点切换为主节点后直接接管主节点的所有槽位。三、核心难点哈希槽 vs 一致性哈希面试高频对比很多面试都会考查“哈希槽与一致性哈希的区别”这也是开发者最容易混淆的点——两者都是分布式系统的分片机制但设计思路、适用场景完全不同结合表格清晰对比方便记忆和面试应答同时补充实战选择技巧。对比维度哈希槽Redis集群核心一致性哈希通用分片算法核心结构固定数量的槽位如16384个数据→槽位→节点三层映射环形哈希空间0~2³²-1数据和节点直接映射到环上节点变动影响仅迁移调整的槽位对应的数据迁移范围可控可手动分配仅影响环上相邻节点的数据迁移范围不可控依赖虚拟节点负载均衡手动调整槽位分配可根据节点性能分配槽位负载更可控依赖虚拟节点实现均衡虚拟节点过多会增加管理和计算开销管理复杂度低槽位数量固定归属清晰Redis集群提供自动迁移工具高需手动实现哈希环、虚拟节点节点管理繁琐适用场景Redis集群、固定分片规则的分布式缓存需高效管理节点通用分布式场景如Nginx负载均衡、非Redis缓存集群面试加分话术哈希槽和一致性哈希的选择核心看“是否需要精细化管理节点和数据分片”若使用Redis集群优先用哈希槽它更适配Redis的高可用机制管理更简单、数据迁移更可控若为通用分布式场景如自定义缓存集群、负载均衡可选择一致性哈希灵活性更高。实际项目中Redis集群的哈希槽机制本质是“将一致性哈希的动态环形转化为固定槽位的静态分配”兼顾了效率和可管理性。四、哈希槽实战操作Redis集群搭建与槽位管理可直接落地理论懂再多不如动手操作一次。下面结合Redis 6.x版本讲解哈希槽的核心实战操作——Redis集群搭建、槽位分配、节点扩容、槽位迁移所有命令可直接复制执行适配实际项目场景。4.1 实战准备环境要求Redis版本6.0及以上支持集群模式无需额外安装哨兵服务器至少3台服务器或本地启动3个Redis实例每台服务器启动1个主节点1个从节点共6个实例端口规划主节点端口7001、7002、7003从节点端口7004、7005、7006核心配置开启集群模式cluster-enabled yes、指定集群配置文件cluster-config-file nodes-7001.conf。4.2 核心实战操作命令详解步骤1启动Redis实例以7001端口为例# 启动Redis实例指定端口和配置 redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes-7001.conf --daemonize yes # 依次启动7002~7006端口实例命令类似替换端口即可 redis-server --port 7002 --cluster-enabled yes --cluster-config-file nodes-7002.conf --daemonize yes redis-server --port 7003 --cluster-enabled yes --cluster-config-file nodes-7003.conf --daemonize yes redis-server --port 7004 --cluster-enabled yes --cluster-config-file nodes-7004.conf --daemonize yes redis-server --port 7005 --cluster-enabled yes --cluster-config-file nodes-7005.conf --daemonize yes redis-server --port 7006 --cluster-enabled yes --cluster-config-file nodes-7006.conf --daemonize yes步骤2创建Redis集群分配哈希槽# 创建集群指定3个主节点自动分配槽位0~5460、5461~10922、10923~16383 redis-cli --cluster create 192.168.1.1:7001 192.168.1.2:7002 192.168.1.3:7003 --cluster-replicas 1 # 说明--cluster-replicas 1 表示每个主节点分配1个从节点集群会自动将7004~7006作为从节点分配给主节点步骤3查看槽位分配情况# 连接任意一个Redis节点查看槽位分配 redis-cli -h 192.168.1.1 -p 7001 192.168.1.1:7001 cluster slots # 输出结果中会显示每个槽位范围对应的主节点和从节点信息步骤4新增节点迁移槽位# 1. 启动新的主节点7007 redis-server --port 7007 --cluster-enabled yes --cluster-config-file nodes-7007.conf --daemonize yes # 2. 将7007加入集群作为主节点 redis-cli --cluster add-node 192.168.1.4:7007 192.168.1.1:7001 # 3. 迁移槽位从7001迁移1000个槽位到7007 redis-cli --cluster reshard 192.168.1.1:7001 # 后续按提示输入迁移槽位数量1000、目标节点ID7007的节点ID、源节点ID7001的节点ID完成迁移步骤5删除节点回收槽位# 1. 先将7007的槽位迁移到其他节点如7001、7002 redis-cli --cluster reshard 192.168.1.1:7001 # 输入迁移槽位数量1000、目标节点ID7001、源节点ID7007完成槽位回收 # 2. 删除7007节点 redis-cli --cluster del-node 192.168.1.1:7001 7007的节点ID4.3 实战注意事项避坑关键槽位迁移必须先迁移数据再删除节点否则会导致数据丢失主节点故障时从节点切换为主节点后会自动接管槽位无需手动分配客户端必须使用支持Redis集群的客户端如JedisCluster、Lettuce否则无法自动路由到对应槽位的节点避免单节点负责过多槽位建议每个主节点负责的槽位数量相差不超过100个防止负载不均。五、哈希槽实战源码Java实现槽位映射理解底层逻辑Redis集群的哈希槽映射逻辑并不复杂下面用Java实现核心的“key→槽位”映射以及“槽位→节点”的简单管理帮助大家理解哈希槽的底层实现可直接套用或修改适配自定义分片场景。5.1 核心功能说明本次实现的哈希槽工具类支持以下核心功能根据key计算对应的哈希槽位模拟Redis的CRC16哈希取模逻辑管理槽位与节点的映射关系分配槽位、查询槽位归属根据key找到对应的节点模拟Redis集群的路由逻辑。5.2 完整源码实现import java.util.HashMap; import java.util.Map; import java.util.zip.CRC32; /** * 哈希槽工具类模拟Redis哈希槽核心逻辑 */ public class HashSlotUtil { // 哈希槽总数Redis默认16384 public static final int TOTAL_SLOTS 16384; // 槽位→节点映射关系key槽位编号value节点标识 private final MapInteger, String slotNodeMap new HashMap(); // 节点→槽位集合映射用于快速查询节点负责的槽位 private final MapString, Integer[] nodeSlotMap new HashMap(); /** * 分配槽位给节点 * param node 节点标识如192.168.1.1:7001 * param startSlot 起始槽位 * param endSlot 结束槽位 */ public void assignSlotsToNode(String node, int startSlot, int endSlot) { // 校验槽位范围 if (startSlot 0 || endSlot TOTAL_SLOTS - 1 || startSlot endSlot) { throw new IllegalArgumentException(槽位范围无效需满足0≤startSlot≤endSlot≤16383); } // 分配槽位 for (int slot startSlot; slot endSlot; slot) { slotNodeMap.put(slot, node); } // 记录节点负责的槽位范围 nodeSlotMap.put(node, new Integer[]{startSlot, endSlot}); System.out.println(节点 node 分配槽位 startSlot ~ endSlot); } /** * 根据key计算对应的哈希槽位模拟Redis的CRC16哈希逻辑简化实现 * param key 数据key如user:1001 * return 槽位编号0~16383 */ public int getSlotByKey(String key) { // 模拟Redis的CRC16哈希实际Redis使用的是CRC16-CCITT算法 CRC32 crc32 new CRC32(); crc32.update(key.getBytes()); long hash crc32.getValue(); // 对16384取模得到槽位编号 return (int) (hash % TOTAL_SLOTS); } /** * 根据key找到对应的节点 * param key 数据key * return 节点标识 */ public String getNodeByKey(String key) { int slot getSlotByKey(key); String node slotNodeMap.get(slot); if (node null) { throw new RuntimeException(槽位 slot 未分配节点请先分配槽位); } return node; } /** * 查询槽位对应的节点 * param slot 槽位编号 * return 节点标识 */ public String getNodeBySlot(int slot) { if (slot 0 || slot TOTAL_SLOTS - 1) { throw new IllegalArgumentException(槽位编号无效需在0~16383之间); } return slotNodeMap.get(slot); } // 测试方法 public static void main(String[] args) { HashSlotUtil hashSlotUtil new HashSlotUtil(); // 分配槽位模拟Redis集群3个主节点的槽位分配 hashSlotUtil.assignSlotsToNode(192.168.1.1:7001, 0, 5460); hashSlotUtil.assignSlotsToNode(192.168.1.2:7002, 5461, 10922); hashSlotUtil.assignSlotsToNode(192.168.1.3:7003, 10923, 16383); // 测试key→槽位→节点的映射 String[] keys {user:1001, order:2001, product:3001, cart:4001}; for (String key : keys) { int slot hashSlotUtil.getSlotByKey(key); String node hashSlotUtil.getNodeByKey(key); System.out.println(key key → 槽位 slot → 节点 node); } } }5.3 源码说明与优化槽位映射采用CRC32哈希模拟Redis的CRC16-CCITT算法简化实现核心逻辑一致——通过哈希函数计算key的哈希值再对16384取模得到槽位数据结构用两个Map分别存储“槽位→节点”和“节点→槽位范围”实现双向查询提升查询效率边界处理添加槽位范围校验、节点不存在校验避免异常场景优化点实际项目中可添加槽位迁移方法批量迁移槽位、节点故障检测适配分布式场景的高可用需求。运行代码后可直接看到key对应的槽位和节点与Redis集群的实际映射逻辑一致可根据需求修改哈希函数、槽位数量适配自定义分片场景。六、哈希槽面试高频题10题必问附通俗解析哈希槽是Redis集群面试的高频考点常结合Redis集群的高可用、数据分片、扩容缩容等场景考查整理10道最常考题解析贴合本文内容面试时直接套用即可无需额外背诵。6.1 基础必问初级面试考题1Redis集群为什么用哈希槽而不用一致性哈希解析核心原因有3点① 哈希槽管理更简单固定16384个槽位节点扩容/缩容时仅迁移槽位归属清晰② 负载更可控可手动调整槽位分配适配节点性能差异③ 适配Redis的高可用机制主从切换后从节点可直接接管槽位数据访问不中断。一致性哈希则存在节点管理繁琐、负载不可控的问题不适合Redis集群场景。考题2Redis哈希槽的总数为什么是16384个解析主要有两个原因① 性能平衡太多槽位会增加节点间槽位同步的开销太少会导致槽位数据量不均16384个既能保证负载均衡又能降低同步开销gossip协议同步槽位信息时数据量小② 历史原因Redis早期版本的哈希函数是16位16^265536后来优化为14位2^1416384兼顾了性能和兼容性。考题3哈希槽的核心原理是什么解析核心原理是“三层映射”① 将数据空间划分为固定数量的槽位默认16384个② 数据key通过哈希函数计算对16384取模得到对应的槽位③ 将槽位分配给集群中的节点节点负责管理自己的槽位实现数据的分布式存储和访问。考题4如何根据Redis的key找到对应的节点解析分两步① 计算key的槽位通过CRC16哈希函数计算key的哈希值再对16384取模得到槽位编号② 查找槽位归属通过Redis集群的槽位分配信息找到该槽位对应的主节点客户端将请求发送到该节点完成数据访问。6.2 核心必问中级面试考题5Redis集群中槽位迁移的过程是什么解析槽位迁移是Redis集群扩容/缩容的核心过程分为3步① 同步数据将源节点中该槽位的所有数据同步到目标节点② 修改槽位归属同步完成后通过集群命令修改槽位的归属将槽位分配给目标节点③ 同步信息集群节点通过gossip协议同步槽位分配信息确保所有节点和客户端都能获取最新的槽位归属。考题6主从节点的槽位关系是什么从节点负责槽位吗解析从节点不负责独立的槽位它的槽位和数据完全同步主节点主节点负责管理自己的槽位处理客户端的读写请求当主节点故障时从节点切换为主节点后会自动接管原主节点的所有槽位继续处理该槽位的数据请求。考题7哈希槽分配不均会导致什么问题如何解决解析问题部分节点负责过多槽位导致该节点负载过高CPU、内存占用过高出现响应缓慢、卡顿等问题解决方法① 手动调整槽位分配将负载高的节点的部分槽位迁移到负载低的节点② 确保每个主节点负责的槽位数量相差不超过100个避免差距过大。考题8客户端访问Redis集群时如何处理槽位不在当前节点的情况解析Redis客户端如JedisCluster会缓存集群的槽位分配信息当客户端发送请求到某个节点而该节点不负责对应的槽位时节点会返回“MOVED”指令告知客户端该槽位对应的正确节点客户端收到指令后会更新本地缓存的槽位信息并将请求重新发送到正确的节点后续同一槽位的请求会直接发送到正确节点无需重复跳转。6.3 高级必问中高级面试考题9哈希槽机制存在哪些缺点如何优化解析缺点① 槽位数量固定无法动态调整虽可修改但不建议会导致集群重启② 手动调整槽位分配需要运维干预不够自动化③ 槽位迁移过程中若网络中断可能导致数据不一致。优化方案① 提前规划节点数量合理分配槽位避免后期频繁调整② 使用Redis集群管理工具如Redis Cluster Manager实现槽位自动迁移③ 开启Redis的持久化RDBAOF迁移过程中做好数据备份避免数据丢失。考题10实际项目中你如何基于哈希槽优化Redis集群性能解析案例某电商项目的Redis集群优化。① 合理分配槽位根据节点性能分配槽位高性能节点负责更多槽位低性能节点负责更少槽位② 热点数据优化将热点key所在的槽位分配到性能更高的节点同时对热点key进行缓存预热、分片存储避免单槽位负载过高③ 扩容策略新增节点时优先迁移热点槽位减少热点数据的迁移开销④ 监控优化实时监控各节点的槽位负载、CPU、内存占用发现槽位不均及时调整避免节点过载。七、总结哈希槽的核心是“可控与高效”哈希槽的核心从来不是复杂的哈希计算而是“在分布式Redis集群中实现数据分片的可控性和高效性”。它放弃了一致性哈希的动态环形结构采用“固定槽位灵活分配”的设计将数据与节点解耦让节点管理、数据迁移、负载均衡都变得更简单、更可控。对于新手先掌握哈希槽的核心逻辑三层映射、槽位分配、节点管理结合本文的实战操作动手搭建一个简单的Redis集群熟悉槽位分配和迁移流程理解它与一致性哈希的区别对于开发者重点掌握哈希槽的实战技巧结合Redis集群的高可用机制合理分配槽位、优化负载均衡处理槽位迁移、节点故障等细节确保Redis集群稳定运行对于面试者重点掌握哈希槽的原理、与一致性哈希的区别、槽位迁移过程结合本文的面试真题解析搭配自身项目经验就能轻松应对各类Redis集群相关面试题——记住哈希槽的核心是“槽位归节点数据归槽位管理更高效”。哈希槽是Redis集群的基石吃透哈希槽不仅能解决Redis分布式存储的核心问题更能理解分布式系统“分片管理、高可用”的设计思想为后续学习分布式缓存、分布式数据库打下坚实基础。建议结合Redis官方文档深入学习槽位迁移、集群故障转移等高级特性提升实战能力。如果觉得有收获欢迎点赞、收藏也可以留言讨论你在哈希槽学习和使用中遇到的问题一起交流进步

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…