go-redis hash slot 之旅

搭建redis 集群

  1. 创建一个网桥
docker network create -d bridge --subnet=192.168.148.0/24 --gateway=192.168.148.1 -o parent=eno1 redis-net
  1. 通过docker 文件创建redis 集群, 这里注意要不要使用redis 7以上的版本,不然会出问题
version: "3"services:redis7001:image: redis:6.2.14 # 指定redis镜像,可以是name:tag/idcontainer_name: redis7001 # 启动后的镜像名称,可有可无ports:- "7001:7001" # 指定对外端口- "17001:17001" # 指定集群端口,根据官网一般为对外端口+10000volumes:# 挂载主机中的配置文件- /home/duron/docker/redis_cluster/redis.conf:/conf/redis.conf# 将数据保存在主机上, 防止丢失- /home/duron/docker/redis_cluster/7001:/datacommand:# 默认的redis启动命令- "redis-server"# 加载指定的配置文件,这里是镜像内的路径- "/conf/redis.conf"# 对外端口号,也可以在redistribution.conf中配置- "--port 7001"# 开启redis集群模式,也可以在redistribution.conf中配置- "--cluster-enabled yes"# 集群节点配置文件名,也可以在redistribution.conf中配置- "--cluster-config-file nodes-7001.conf"networks:extnetwork:ipv4_address: 192.168.148.71 # 向桥接网络申请ip地址redis7002:image: redis:6.2.14container_name: redis7002ports:- "7002:7002"- "17002:17002"volumes:- /home/duron/docker/redis_cluster/redis.conf:/conf/redis.conf- /home/duron/docker/redis_cluster/7002:/datacommand:- "redis-server"- "/conf/redis.conf"- "--port 7002"- "--cluster-enabled yes"- "--cluster-config-file nodes-7002.conf"networks:extnetwork:ipv4_address: 192.168.148.72redis7003:image: redis:6.2.14container_name: redis7003ports:- "7003:7003"- "17003:17003"volumes:- /home/duron/docker/redis_cluster/redis.conf:/conf/redis.conf- /home/duron/docker/redis_cluster/7003:/datacommand:- "redis-server"- "/conf/redis.conf"- "--port 7003"- "--cluster-enabled yes"- "--cluster-config-file nodes-7003.conf"networks:extnetwork:ipv4_address: 192.168.148.73redis7004:image: redis:6.2.14container_name: redis7004ports:- "7004:7004"- "17004:17004"volumes:- /home/duron/docker/redis_cluster/redis.conf:/conf/redis.conf- /home/duron/docker/redis_cluster/7004:/datacommand:- "redis-server"- "/conf/redis.conf"- "--port 7004"- "--cluster-enabled yes"- "--cluster-config-file nodes-7004.conf"networks:extnetwork:ipv4_address: 192.168.148.74redis7005:image: redis:6.2.14container_name: redis7005ports:- "7005:7005"- "17005:17005"volumes:- /home/duron/docker/redis_cluster/redis.conf:/conf/redis.conf- /home/duron/docker/redis_cluster/7005:/datacommand:- "redis-server"- "/conf/redis.conf"- "--port 7005"- "--cluster-enabled yes"- "--cluster-config-file nodes-7005.conf"networks:extnetwork:ipv4_address: 192.168.148.75redis7006:image: redis:6.2.14container_name: redis7006ports:- "7006:7006"- "17006:17006"volumes:- /home/duron/docker/redis_cluster/redis.conf:/conf/redis.conf- /home/duron/docker/redis_cluster/7006:/datacommand:- "redis-server"- "/conf/redis.conf"- "--port 7006"- "--cluster-enabled yes"- "--cluster-config-file nodes-7006.conf"networks:extnetwork:ipv4_address: 192.168.148.76networks:extnetwork: # 定义外部桥接网络external:name: redis-net

什么是redis cluster的hash slot

redis的hash槽在redis集群中的作用是用来将数据分配到不同的slot,来降低单个节点的压力,来保证redis的工作效率。

redis 是如何将key分配到不同的槽里的呢

redis 是同过CRC16 算法对数据进行hash取值然后在和16384 进行去模的到的slot的结果,我们在查询/存储key的时候会更具slot去获取数据或写入数据。

为什么要分配16384个

Redis 集群使用哈希槽(hash slot)来决定一个给定的键应该被分配到哪个节点。总共有 16384 个哈希槽,这个数字是一个折中的选择。

如果哈希槽的数量太少,例如只有 100 个,那么在大规模集群中,每个节点将需要处理大量的哈希槽,这可能会导致负载分布不均。另一方面,如果哈希槽的数量太多,例如 1 亿,那么管理这些哈希槽的开销将会非常大,尤其是在节点添加或删除时。

因此,16384 是一个在分布均匀性和管理开销之间取得平衡的数字。它足够大,可以在大规模集群中实现均匀的负载分布,同时又足够小,可以在节点变动时快速重新分配哈希槽。

为什么redis hash 槽要选择CRC16算法

  1. 计算速度快:CRC16 是一种非常简单的算法,计算速度非常快。这对于 Redis 这种需要处理大量键值对的数据库系统来说非常重要。

  2. 分布均匀:虽然 CRC16 是一种简单的算法,但它生成的哈希值在 0 到 16383 之间的分布是相当均匀的。这意味着键值对在 Redis 集群的各个节点之间的分布也会比较均匀。

redis 是如何获取slot的

1.) 在我们进行查询和写入操作的时候,代码在构建玩cmd的时候我们就进入了process函数,该函数的第一步就是先获取slot,红框中的代码就是获取到hash槽中的slot的值
在这里插入图片描述
2.)我们进入到cmdSlot 函数里面我们就会发现,我们马上要开始获取slot了,在进入cmdFirstKeyPos获取到pos值以后我们就可以进入slot函数获取hash slot的值了(keyPos 字段是用来帮助 go-redis 库正确地处理 Redis 集群的一个重要字段。)
在这里插入图片描述
3.)我们从这里就看到了hash slot的算法了,他正如我说的那样通过crc16算出hash值和16384 进行取模来获取我们需要通过那个slot来获取/写入数据
在这里插入图片描述

获取到slot后我们如何获取连接呢?

1.) 我们通过代码可以看到在获取到slot后,我们会进入一个cmdNode的一个函数里面,我们就是通过slot值在这个函数里面获取到node 节点的。
在这里插入图片描述
2.)我们进入cmdNode 可以看出来,这个函数给我们做了读写分离,因为我们没有开启读写分离,所以我们默认会进入slotMasterNode里面
在这里插入图片描述
3.) 我们进入这个函数可以看到,我们通过sloaNodes来获取slot 如果nodes获取失败 = 0的情况下 我们默认走了random模式 默认随机了
在这里插入图片描述
4. )该函数我们可以看出来,这个函数判断了我们的slot是否在这些nodes 里面,如果在并获取这个节点的节点信息。
在这里插入图片描述

注意:

以上代码是在"github.com/redis/go-redis/v9" v9版本的支持下进行的,如果我们使用的是v6版本,我们会发现在我们进行slot 获取的时候会报错,报错会存储到firstErr的一个字段里面,这时候系统监测到该字段有错误,就会默认进行 随机获取slot的一个操作。

redis: got 7 elements in COMMAND reply, wanted 6

所以我们如果想使用hash slot 就需要升级到高一些的版本。

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

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

相关文章

ArcGIS学习(三)数据可视化

ArcGIS学习(三)数据可视化 1.矢量数据可视化 需要提前说明的是,在ArcGIS中,所有的可视化选项设置都是在“图层属性”对话框里面的“符号系统”中实现的。 对于矢量数据的可视化,主要有四种可视化方式: 按“要素”可视化按“类别”可视化按“数量”可视化按“图表”可视…

最近宣布的NIST后量子密码学标准的3个关键要点

当今世界依赖于许多保护措施,即使您没有注意到这一点。从手机和智能技术到网站,从支付交易到城市基础设施,人们经常与之互动的一切,都通过保护和检查技术来保护。量子计算机能够快速轻松地打破这些保护措施,这是政府和…

django+flask网上购物商城系统的设计与实现python-vue

全球经济在快速的发展,中国更是进步飞速,这使得国内的互联网技术进入了发展的高峰时期,这让中外资本不断转向互联网这个大市场[3]。在这个信息高度发达的现在,利用网络进行信息管理改革已经成为了人们追捧的一种趋势。“网上购物系…

01-Datahub是什么?

Datahub是LinkedIn开源的基于现代数据栈的元数据管理平台,原来叫做WhereHows 。经过一段时间的发展datahub于2020年2月在Github开源。 官网地址为:A Metadata Platform for the Modern Data Stack | DataHub 源码地址为:GitHub - datahub-p…

stable-diffusion | v1-5-pruned.ckpt和v1-5-pruned-emaonly.ckpt的区别

https://github.com/runwayml/stable-diffusion?tabreadme-ov-file#reference-sampling-script 对于 1.5 模型,其中可能包括四部分:标准模型、文本编码器、VAE模型、EMA模型。 标准模型:生成图片的核心模块,潜空间中的前向扩散和…

STM32F407移植OpenHarmony笔记9

继上一篇笔记,已经完成liteos内核的基本功能适配。 今天尝试启动OHOS和XTS兼容性测试。 如何启动OHOS? OHOS系统初始化接口是OHOS_SystemInit(void),在内核初始化完成后,就能调用。 extern void OHOS_SystemInit(void); OHOS_Sys…

sqli-labs-master靶场训练笔记(21-38|精英级)

2024.1.30 level-21 (cookie 注入数据加密) 从页面上就可以看出这次的数据被 baes64 加密了 中国有句古话:师夷长技以制夷 ,用base64加密后的数据即可爆出数据 加密前: admin and updatexml(1,concat(~,(select database()),~),1) and …

javaEE - 21( 15000字 Tomcat 和 HTTP 协议入门 -2)

一: HTTP 响应 1.1 认识 “状态码” (status code) 状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况…),以下为常见的状态码. 1.1.1 200 OK 这是一个最常见的状态码, 表示访问成功. 抓包抓到的大部分结果都是 200 HTTP/…

Ps:文档窗口状态栏

状态栏 Status Bar位于每个文档窗口的底部,可显示诸如视图的缩放比例及文件相关的有用信息。 ◆ ◆ ◆ 缩放比例 显示当前视图的放大比例,例如 100% 表示实际大小。 有关视图的缩放,请参阅: 《Ps:缩放工具》 可以直接…

备战蓝桥杯---搜索(优化1)

显然&#xff0c;我们可以用BFS解决&#xff0c;具体实现与八数码类似&#xff1a; 下面是代码&#xff1a; #include<bits/stdc.h> using namespace std; #define N 3000000 string a,b; int hh,dis[N],cnt; struct node{string u,v; }bian[7]; map<string,int>…

ERP 系统架构的设计与实践总结

企业资源计划&#xff08;ERP&#xff09;系统是一种集成多个业务功能的综合性软件解决方案。在设计和实践 ERP 系统架构时&#xff0c;需要考虑诸多因素&#xff0c;以确保系统能够满足企业的需求&#xff0c;并提供高效、可靠、安全的服务。本文将介绍一些关键的设计原则和实…

pytorch索引和切片

目录 1. 按索引方式取数据2. 以python切片方式取数据3. 指定index取数据4. ...代表除其前后指定维度外的所有维度5. masked_select() 使用掩码选择元素6. take 矩阵打平后选取 1. 按索引方式取数据 a[0,0,2,4] 其中0&#xff0c;0&#xff0c;2&#xff0c;4是索引从0开始 2. …