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.mzph.cn/news/667711.shtml

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

相关文章

Tomcat组件架构与数据流

一、背景与简介 Tomcat我们都知道是一个开源的、实现了大部分Java EE、Servlet、JSP规范的Servlet容器, 允许我们将实现了Serlvet接口的Web程序war包进行部署运行。 但是你有对Tomcat做过细致的学习么? 我相信大部分同学和我一样,之前也是只会进行简单使用&#x…

django线上教育学习平台大数据分析系统python

随着互联网技术不断地发展,网络与大数据成为了人们生活的一部分,而线上教育平台大数据分析作为网上应用的一个全新的体现,由于其特有的便捷性,已经被人们所接受。目前主流的线上教育平台大数据分析服务不仅不明确并且管理盈利较低…

专业课130+总分420+南京大学851信号与系统考研经验南大电子信息与通信系统

经过一年的复习,顺利上岸,被南京大学录取,今年专业课130,总分420,回忆这一年的复习还是有很多经验分享,希望对大家复习有帮助。 专业课: 南京大学851信号与系统难度这几年无论是范围还是难度都…

【MySQL】学习并使用DQL实现排序查询和分页查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-SP91zTA41FlGU0Ce {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

计算机服务器中了DevicData勒索病毒如何解密,DevicData勒索病毒解密流程

网络数据安全一直是企业关心的主要话题,近期,云天数据恢复中心接到很多企业的求助,企业的计算机服务器遭到了DevicData勒索病毒攻击,导致企业计算机服务器瘫痪无法正常工作,严重影响了工作业务开展。经过云天数据恢复中…

【已解决】c++ qt选中该行为什么该列部分变色

笔者开启了QTableView中交替行改变颜色,发现笔者自定义绘制的水平滚动条,在选中后不发生颜色改变,这让笔者很疑惑。笔者查阅资料后发现,自定义绘制的控件,要自身设置颜色。当笔者解决了这个问题时,顺手就将…

【SAR成像】基于RD、CS和ωk算法的合成孔径雷达成像算法原理与实现

基于RD、CS和ωk算法的合成孔径雷达成像算法实现 前言SAR基本概念雷达获取数据的几何关系低斜视角下的回波信号模型 RADARSAT-1主要参数数据预处理数据读取与再封装数据补零 成像算法坐标轴的产生RD算法距离压缩距离徙动矫正方位压缩 CS算法第一次相位相乘 变标后的信号第二次相…

基于若依的ruoyi-nbcio流程管理系统自定义业务实现一种简单的动态任务标题需求

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…

[Android] 240204批量生成联系人,短信,通话记录的APK

平常在做测试的时候,需要批量生成很多测试数据; 陌生人 联系人名字的生成支持随机生成,也可以自定义生成,自定义生成陌生人的数据,联系人的名字是否带索引; 通话记录 随机生成通话记录,在生…

free5GC+UERANSIM

使用arp、ifconfig、docker inspect及网桥brctl 相关命令,收集容器IP及Mac地址相关信息,可以梳理出UERANSIMfree5GC模拟环境组网,如下图所示: 如上图所示:环境基于ubuntu 18.04 VMware虚机部署,5GC网元分别…

【Python】Unindent does not match any outer indentation level

这个问题一般是代码缩进问题导致的,规范代码缩进格式即可,如图: 这个问题是因为报异常的那行代码下的方法缩进问题导致,def calendar_f(): 方法名前面多了一个空格。 删除空格即可解决此问题。

【python】python爱心代码【附源码】

一、实现效果: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码: import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…

Fink CDC数据同步(五)Kafka数据同步Hive

6、Kafka同步到Hive 6.1 建映射表 通过flink sql client 建Kafka topic的映射表 CREATE TABLE kafka_user_topic(id int,name string,birth string,gender string ) WITH (connector kafka,topic flink-cdc-user,properties.bootstrap.servers 192.168.0.4:6668…

天拓四方:边缘计算网关功能、特点与应用举例

传统的数据处理方式面临网络延迟、带宽限制和安全风险等问题。为了解决这些问题,边缘计算技术应运而生,而边缘计算网关作为其核心组件,正发挥着越来越重要的作用。边缘计算网关位于数据源和云数据中心之间。它具备数据采集、协议转换、数据处…

视觉SLAM十四讲学习笔记(一)初识SLAM

目录 前言 一、传感器 1 传感器分类 2 相机 二、经典视觉 SLAM 框架 1 视觉里程计 2 后端优化 3 回环检测 4 建图 5 SLAM系统 三、SLAM 问题的数学表述 四、Ubuntu20.04配置SLAM十四讲 前言 SLAM: Simultaneous Localization and Mapping 同时定位与地图构建&#…

交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。

随着社交网络的发展和普及,人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物,它利用移动互联网的便利性,将同城内的人们连接在一起,打破了时空的限制&#…

机器视觉系统设计:视觉系统中的成像基准

开发视觉系统的一个重要活动是验证其部署是否符合工程规范。一个成功的视觉应用程序的两个特点是它无需工程师干涉情况下正常工作了多长时间,以及它的维护和复制部署是多么简易。实现所有如上所述目标的一个关键步骤是确定视觉系统的基准。 在这里使用的上下文中&a…

移动云ONAIR媒体云全解读!媒体内容数字化融合一站式解决方案

当下,传统媒体面临着诸多挑战,如何利用信息技术提升内容的质量、形式和分发效率,成为媒体行业的迫切需求。移动云作为数字中国建设的“主力军”, 立足于新兴媒体与云计算市场的变化与需求,推出了ONAIR 媒体云解决方案&…

vue2学习笔记(2/2)

vue2学习笔记(1/2) vue2学习笔记(2/2) 文章目录 1. 初始化脚手架2. 分析脚手架&render函数文件结构图示及说明main.jsindex.htmlApp.vueSchool.vueStudent.vue 关于不同版本的Vue修改默认配置vue.config.js配置文件 3. ref属…

08. 【Linux教程】CentOS 目录介绍

CentOS 目录介绍 前面小节介绍了如何安装并登录连接 CentOS 系统,本小节围绕 CentOS 系统的目录,介绍其各个目录的作用,方便读者以后在工作中很好地将项目和软件归类存储,熟悉 CentOS 系统各个目录的功能介绍,有助于加…