ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

源码分析:go-redis 集群客户端 key 路由的实现

2021-10-25 09:32:14  阅读:224  来源: 互联网

标签:clusterNode end clusterState -- redis generation 源码 key nodes


源码:https://github.com/go-redis/redis/tree/v8.11.4

数据结构

flowchart LR subgraph clusterClient n["nodes *clusterNodes"] s["state *clusterState"] end subgraph sCNs["clusterNodes"] n2["nodes map[string]*clusterNode"] end subgraph sCS["clusterState"] s2["slots []*clusterSlot"] gg["generation uint32"] end subgraph sCSt["clusterSlot"] se["start, end int"] n3["nodes []*clusterNode"] end subgraph sCN["clusterNode"] c["Client *Client"] g["generation uint32"] end n --> sCNs s --> sCS s2 --> sCSt n2 --> sCN n3 --> sCN gg -.- g
  • clusterClient:集群客户端抽象
  • clusterNodes:维护集群内「实例地址=>节点」的映射
  • clusterState:维护集群内「哈希槽=>节点」的映射,创建后不可修改,只能通过新建替换更新,每次新建 generation 自增。
  • clusterSlot:一个范围的哈希槽以及负责这些槽的节点(第一个为主节点,其余为从节点),start为起始哈希槽编号,end为起结束希槽编号,nodes为负责这些槽的节点。
  • clusterNode:集群节点抽象。client为连接此节点的客户端,generation与clusterState的generation关联。

算法

flowchart TD A[执行命令] --> B{"clusterClient.state<br/>是否存在?"}; B -->|不存在| C["使用 CLUSTER SLOTS 命令 获取「哈希槽=>实例地址」的映射信息"]; C --> D["根据「哈希槽=>实例地址」的映射信息创建clusterState, 设置最新的 clusterState.generation, 根据实例地址,请求clusterClient.nodes创建或获取clusterNode; 设置clusterNode.generation为clusterState.generation, clusterSlot.nodes引用这些clusterNode"] D --> E["根据命令key计算slot编号,根据slot编号 定位 clusterSlot = clusterClient.state.slots[*]"] E --> F["使用clusterSlot.nodes[0].Client执行命令"] D -."异步".-> G["运行一次性定时器,一段时间后检查clusterSlot.nodes, 如果其中包含clusterNode.generation小于该 clusterState.generation,移除这些clusterNode, 关闭clusterNode.Client释放资源"] B -->|存在| H[" "] --> E H -."如果clusterState创建时间 过旧,异步执行".-> S F --"如果返回MOVED重定向"--> I["根据重定向提供的实例地址, 请求clusterClient.nodes创建或获取clusterNode, 使用clusterNode.Client执行命令"] I -.->|异步执行| S subgraph S["Create/Update state"] C D G end

标签:clusterNode,end,clusterState,--,redis,generation,源码,key,nodes
来源: https://www.cnblogs.com/roy2220/p/15456992.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有