go-redis源码解析:cluster模式如何选择节点

1. 如何选择节点

img

1.1. 确定slot

1.1.1. 通过cmdSlot方法确定在哪个槽上, 这一步只是本地计算

首先入口方法_process,先通过cmdSlot方法用key计算此次应该落在哪个槽上

img通过crc16sum算法计算key应该属于哪个槽,slotNumber为16384

func Slot(key string) int {if key == "" {return RandomSlot()}key = Key(key)return int(crc16sum(key)) % slotNumber
}

1.2. 选取节点的核心方法

img

1.2.1. cmdNode内部实现

img

1.2.2. slotReadOnlyNode方法实现

func (c *ClusterClient) slotReadOnlyNode(state *clusterState, slot int) (*clusterNode, error) {if c.opt.RouteByLatency {return state.slotClosestNode(slot)}if c.opt.RouteRandomly {return state.slotRandomNode(slot)}return state.slotSlaveNode(slot)
}

2. 如何获取所有节点

img

2.1. c.state.Get(ctx)方法,获取所有节点

/*
如果之前没有获取过状态信息,调用Reload方法来重新加载状态信息
如果之前已经获取过状态信息,并且距离上次获取状态信息的时间超过10秒,那么会进行异步重新加载
*/
func (c *clusterStateHolder) Get(ctx context.Context) (*clusterState, error) {v := c.state.Load()if v == nil {return c.Reload(ctx)}state := v.(*clusterState)if time.Since(state.createdAt) > 10*time.Second {c.LazyReload()}return state, nil
}

2.1.1. 第一次时,调用reload

2.1.1.1. reload方法

reload方法内,核心方法为c.load(ctx), 而load方法,为初始化时通过newClusterStateHolder设置进来的fn

img

2.1.1.2. fn如下,为核心获取所有节点的c.loadState方法

img

2.1.2. 后续调用LazyReload

func (c *clusterStateHolder) LazyReload() {if !atomic.CompareAndSwapUint32(&c.reloading, 0, 1) {return}go func() {defer atomic.StoreUint32(&c.reloading, 0)_, err := c.Reload(context.Background())if err != nil {return}time.Sleep(200 * time.Millisecond)}()
}

LazyReload内部还是调用c.Reload方法

2.2. 核心方法:获取所有节点loadState方法实现

img

2.2.1. 核心为通过node.Client.ClusterSlots(ctx)命令查询所有节点信息

img

// zhmark 2024/7/3 核心获取所有节点信息的方法
func (c *ClusterClient) loadState(ctx context.Context) (*clusterState, error) {if c.opt.ClusterSlots != nil {slots, err := c.opt.ClusterSlots(ctx)if err != nil {return nil, err}return newClusterState(c.nodes, slots, "")}addrs, err := c.nodes.Addrs()if err != nil {return nil, err}var firstErr error// 从配置的addrs里,随机选择一个节点,执行查询所有节点for _, idx := range rand.Perm(len(addrs)) {addr := addrs[idx]node, err := c.nodes.GetOrCreate(addr)if err != nil {if firstErr == nil {firstErr = err}continue}slots, err := node.Client.ClusterSlots(ctx).Result()if err != nil {if firstErr == nil {firstErr = err}continue}return newClusterState(c.nodes, slots, node.Client.opt.Addr)}/** No node is connectable. It's possible that all nodes' IP has changed.* Clear activeAddrs to let client be able to re-connect using the initial* setting of the addresses (e.g. [redis-cluster-0:6379, redis-cluster-1:6379]),* which might have chance to resolve domain name and get updated IP address.*/c.nodes.mu.Lock()c.nodes.activeAddrs = nilc.nodes.mu.Unlock()return nil, firstErr
}

通过调用cluster slots获取所有的节点信息

func (c cmdable) ClusterSlots(ctx context.Context) *ClusterSlotsCmd {cmd := NewClusterSlotsCmd(ctx, "cluster", "slots")_ = c(ctx, cmd)return cmd
}

2.3. 注意:如果没有配置readonly,默认都调用master节点

img

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

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

相关文章

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母,回显 evil input 查看源码,发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz: 发现过滤掉了数字和小写字母以及一些符号,下面框起来的部分是可用的 结合题目提…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

Facebook:数字社交的引领者与创新者

自2004年诞生以来&#xff0c;Facebook从一个校园网络项目迅速成长为全球最大的社交媒体平台&#xff0c;彻底改变了我们与世界互动的方式。作为数字社交的引领者和创新者&#xff0c;Facebook不仅在技术层面上不断突破&#xff0c;也在社会和文化领域留下了深刻的印记。本文将…

如何对GD32 MCU进行加密?

GD32 MCU有哪些加密方法呢&#xff1f;大家在平时项目开发的过程中&#xff0c;最后都可能会面临如何对出厂产品的MCU代码进行加密&#xff0c;避免产品流向市场被别人读取复制。 下面为大家介绍GD32 MCU所支持的几种常用的加密方法&#xff1a; 首先GD32 MCU本身支持防硬开盖…

Flutter第十五弹 Flutter插件

目标&#xff1a; 1.Flutter插件是什么&#xff1f;有什么作用&#xff1f; 插件 (plugin) 是 package 的一种&#xff0c;全称是 plugin package&#xff0c;我们简称为 plugin&#xff0c;中文叫插件。 2.怎么创建Flutter插件&#xff1f; 一、什么是插件 在flutter中&am…

mysql逗号分割字符串“1,2,3”实现in查询

数据示例 前台单值参数实现in查询 主要函数FIND_IN_SET 该函数的作用是查询字段(strlist) 中是否包含(str)的结果&#xff0c;返回结果为 null或记录 select id,recommend_position_id from t_stk_task where FIND_IN_SET(359919,recommend_position_id)查询效果 前台集…

vue3单个页面进行防抖节流

防抖 <template><button id"submitButton" ref"submitButton">GET</button> </template><script lang"ts" setup> import { ref, onMounted } from vue;// 防抖函数 function debounce(func: () > void, dela…

Python从入门到放弃——浮点型变量

浮点型变量 前言 上一篇文章我们研究了整数类型变量&#xff0c;本次我们来开始研究一下浮点类型变量。 浮点类型 浮点数在计算机编程中扮演着重要的角色。它们是一种特殊的数据类型&#xff0c;用于存储和处理小数或实数。在Python中&#xff0c;浮点数是由小数点分隔的…

[数据结构] --- 树

1 树的基本概念 1.1 树的定义 树是n(n>0)个结点的有限集。当 n 0 时&#xff0c;称为空树。在任意一棵树非空树中应满足&#xff1a; (1) 有且仅有一个特定的称为根 (root) 的结点&#xff1b; (2) 当 n > 1 时&#xff0c;其余结点可分为m(m>0)个互不相交的有限集…

【Unity 3D角色移动】

【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤&#xff0c;包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码&#xff1a; 步骤1&#xff1a;设置角色的物理属性 角色通常使用Character Co…

单目相机减速带检测以及测距

单目相机减速带检测以及测距项目是一个计算机视觉领域的应用&#xff0c;旨在使用一个摄像头&#xff08;单目相机&#xff09;来识别道路上的减速带&#xff0c;并进一步估计车辆与减速带之间的距离。这样的系统对于智能驾驶辅助系统&#xff08;ADAS&#xff09;特别有用&…

【JavaWeb】利用IntelliJ IDEA 2024.1.4 +Tomcat10 搭建Java Web项目开发环境(图文超详细)

1、启动IntelliJ idea 2024.1.4 在欢迎页面&#xff0c;请确认好版本。因为不同的版本&#xff0c;搭建项目过程不太一样。 点击&#xff0c;新建项目。如图&#xff1a; 2、新建项目 在新建项目界面&#xff0c;选择java&#xff0c;在右侧信息模块内&#xff0c;根据个人情…

关于ant design vue 使用Modal无法关闭弹窗的解决思路

文章目录 1: 出现问题的版本2.出现问题&#xff08;1&#xff09;ant design 的问题&#xff08;2&#xff09;poina的提示报错 3.正确版本总结 1: 出现问题的版本 "ant-design-vue": "^3.2.20", "pinia": "^2.1.7", "vue"…

Ubuntu18.04新安装--无网络连接、重启黑屏解决教程

一、安装Ubuntu Ubuntu安装需要U盘作为启动盘&#xff0c;在目前教新的电脑中选中GPT作为分区&#xff0c;制作启动盘&#xff0c;其中在安装双系统Ubuntu时&#xff0c;以自定义格式作为存储空间。详细安装过程以以及如何分区请参考下列链接&#xff1a;内含详细安装过程&…

如何在Lazada平台快速出单?测评助力商家突破销量瓶颈

Lazada在短短的几年里已经发展成了东南亚地区最大的在线购物网站之一 &#xff0c;很多商家也想要在这样一个大的跨境平台上发展。那么&#xff0c;对于希望在Lazada平台上大展拳脚的商家而言&#xff0c;出单是否容易呢? ​一、Lazada出单容易吗? Lazada出单的难易程度并非…

Simulink 模型生成 C 代码(四):比较模型仿真和生成代码的结果

接下来将验证生成的代码执行时在数值上等效于 Simulink 中建模的算法。您使用测试框架模型在普通模式下对 RollAxisAutopilot 进行仿真&#xff0c;并在 SIL 模式下进行仿真&#xff0c;然后使用仿真数据检查器比较这两个仿真。 要测试生成的代码&#xff0c;您可以运行软件在…

Kubernetes基于helm安装 harbor

Kubernetes基于helm安装 harbor 之前harbor的安装都是借助docker完成一键安装部署&#xff0c;安装完成之后harbor组件均运行到一台机器上面&#xff0c;本文实践harbor在k8s环境中的部署。 准备工作 根据harbor官方要求&#xff1a; Kubernetes cluster 1.20Helm v3.2.0 …

SpringMVC基础详解

文章目录 一、SpringMVC简介1、什么是MVC2、MVC架构模式与三层模型的区别3、什么是SpringMVC 二、HelloWorld程序1、pom文件2、springmvc.xml3、配置web.xml文件4、html文件5、执行Controller 三、RequestMapping注解1、value属性1.1、基础使用1.2、Ant风格&#xff08;模糊匹配…

如何清理电脑内存?让电脑运行如飞!

电脑内存&#xff08;RAM&#xff09;的清理对于维持系统的流畅运行至关重要。随着使用时间的增加&#xff0c;系统内存会被各种应用程序和后台进程占用&#xff0c;导致系统响应变慢&#xff0c;甚至出现卡顿现象。通过有效地清理内存&#xff0c;可以提升电脑的性能&#xff…

数据库安全:MySQL权限体系划分与实战操作

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…