一致性哈希算法

Redis一致性哈希算法和哈希槽区别 一致性哈希算法和哈希槽(Hash Slot)都是在分布式系统中用于数据分片和节点映射的技术,主要应用于像 Redis 集群这样需要将数据分散存储在多个节点的场景。一致性哈希是在哈希取余算法基础之上优化的,分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不对了。用于解决分布式缓存系统中的数据选择节点存储问题和数据选择节点读取问题以及在增删节点后减少数据缓存的消失范畴,防止雪崩的发生。 阅读详情

目的:为了解决分布式系统中缓存key的雪崩问题。

一致性哈希算法在 1997 年由麻省理工学院提出,是一种特殊的哈希算法,在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系;
一致性哈希解决了简单哈希算法在分布式哈希表(Distributed Hash Table,DHT)中存在的动态伸缩等问题;

一致性hash是对固定值2^32取模;

一致性Hash的工作原理或算法

① hash环

② 服务器映射到hash环

使用hash(服务器ip)% 2^32

③ 对象key映射到服务器

Key的Hash值:hash(key)% 2^32

此处的Hash函数可以和之前计算服务器映射至Hash环的函数不同

从缓存对象key的位置开始,沿顺时针方向遇到的第一个服务器,便是当前对象将要缓存到的服务器;

**①②③便是一致性Hash的工作原理:**将原本单个点的Hash映射,转变为了在一个环上的某个片段上的映射!

服务器扩缩容场景

① 服务器减少

把缩减服务器上的所有key顺时针移到下一个服务器即可

② 服务器增加

对相邻的两个服务器上的key进行重分配

数据偏斜&服务器性能平衡问题

原因:在Hash环上分配的点太少。导致把环分配的不均衡。

点多,则相应会把环分配的比较均衡。则引入虚拟节点的计算

虚拟节点的计算

  • hash(10.24.23.227#1)% 2^32
  • hash(10.24.23.227#2)% 2^32
  • hash(10.24.23.227#3)% 2^32

三、一致性Hash算法java实现

一致性Hash算法实现

下面我们根据上面的讲述,实现一个一致性Hash算法,这个算法具有一些下面的功能特性:

  • 一致性Hash核心算法;
  • 支持自定义Hash算法;
  • 支持自定义虚拟节点个数;
package com.job.hash;
 
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
/**
 * 一致性hash算法
 */
public class HashUtil {
 
 
    private static Map<Integer,String>  nodeMap = new HashMap<Integer, String>();
 
    //1024个虚拟节点
    private static int V_NODES = 1024;
 
    private static TreeMap<Integer,String> vNodeMap = new TreeMap<Integer, String>();
    private static final int REAL_NODE_COUNT = 8;
    static {
        nodeMap.put(0,"node_0");
        nodeMap.put(1,"node_1");
        nodeMap.put(2,"node_2");
        nodeMap.put(3,"node_3");
        nodeMap.put(4,"node_4");
        nodeMap.put(5,"node_5");
        nodeMap.put(6,"node_6");
        nodeMap.put(7,"node_7");
 
        /**
         * 虚拟节点和真实节点的映射
         */
        for(int i=0;i<V_NODES;i++){
            vNodeMap.put(i,nodeMap.get(i % REAL_NODE_COUNT));
        }
    }
 
    /**
     * 获取真实节点
     * @param value
     * @return
     */
    public static String getRealServerNode(String value){
        Integer code = (value.hashCode()& 0x7FFFFFFF) % 1024;
        return vNodeMap.ceilingEntry(code).getValue();
    }
 
 
    /**
     * 删除一个节点
     * @param nodeName
     */
    public static void dropNode(String nodeName){
 
        int node = -1;
 
        for(Map.Entry<Integer,String> entry : nodeMap.entrySet()){
            if(entry.getValue().equalsIgnoreCase(nodeName)){
                node = entry.getKey();
                break;
            }
        }
        if(node == -1){
            System.out.println("未找到节点:"+nodeName);
            return;
        }
 
 
        Iterator<Map.Entry<Integer,String>> iter = vNodeMap.entrySet().iterator();
        while (iter.hasNext()){
           Map.Entry<Integer,String> entry =  iter.next();
           Integer key = entry.getKey();
 
           if(key % REAL_NODE_COUNT == node){
               System.out.println("删除节点:"+key+",value:"+entry.getValue());
               iter.remove();;
           }
        }
 
    }
 
    public static void main(String[] args) {
        String requestValue = "hello jason";
        System.out.println("映射关系"+vNodeMap);
        System.out.println(getRealServerNode(requestValue));
        System.out.println("删除节点");
        dropNode("node_3");
        System.out.println("映射关系"+vNodeMap);
        System.out.println(getRealServerNode(requestValue));
    }
 
}
redis 一致性哈希算法 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。 阅读详情

相关推荐

Ketama一致性哈希算法源码剖析与实战

分布式哈希技术是构建大规模分布式系统的关键技术之一,它通过将数据合理地分布在多个服务器节点上,从而实现系统的高可用性与可扩展性。该技术的核心在于哈希函数的应用,通过哈希函数将数据或请求映射到特定的服务器节点,以实现快速的定位和访问。在分布式系统中,传统哈希方法面临着节点增减导致数据迁移的挑战,这直接影响系统的稳定性和性能。为了应对这一问题,一致性哈希算法应运而生,它通过特定的算法设计减少了节点变化对系统的影响,成为分布式存储和缓存系统中广泛采纳的解决方案。

weixin_29317963的博客 850

说一说Redis中如何使用一致性哈希算法

Redis一致性哈希算法解析:从传统哈希到分布式优化 本文系统性地介绍了Redis中一致性哈希算法的原理与实现。首先通过传统哈希算法在节点扩容时的痛点引入问题,详细讲解了一致性哈希的环状结构设计及其平滑扩容优势。随后剖析了Redis Cluster采用的16384槽位变种实现,以及虚拟节点技术如何解决数据分布不均问题。文章还对比了一致性哈希的优缺点,并通过社交平台缓存案例展示了实际应用场景。最后总结了渐进式扩容等最佳实践,为构建高可用Redis集群提供了实用指导。

从不水文,坚持创作,加油 1328

HybridCLR热更新打包报错全解析:从原理到实战解决方案

热更新技术是现代游戏和应用开发中实现动态内容交付与Bug修复的核心机制,它允许开发者在无需重新发布完整应用的情况下更新代码逻辑。其原理通常涉及在运行时加载并执行新的代码模块,这要求框架在底层实现安全的代码隔离、内存管理与元数据桥接。在Unity生态中,HybridCLR作为基于IL2CPP的高性能热更新解决方案,通过补充元数据和AOT泛型引用技术,实现了对C#代码的原生级热更支持,显著提升了开发迭代效率与线上问题修复能力。然而,在实际的工程实践中,尤其是在面向Android、iOS等多平台打包构建时,开发者

weixin_29017445的博客 309

一致性哈希算法解析

想象我们的网络世界是一个巨大的环形摩天轮,上面有无数的座位,每个座位都代表了一个存储空间。现在,我们需要将三万张照片安排到这个摩天轮的三台机器上。这些机器我们可以想象成三个大车厢,每个车厢可以装载一部分照片。在简单的哈希算法中,我们通过计算每张照片的哈希值来决定它应该放在哪个车厢。但如果我们决定在摩天轮上增加一个新的车厢,这时问题就来了。原本均匀分布的照片因为新车厢的加入,许多照片需要被重新分配到不同的车厢中,这就像是你已经坐好了,突然被告知要换一个座位,造成了大混乱。

avery66666的博客 831

(一)PyBullet机器人仿真入门:从环境搭建到实例解析

本文详细介绍了PyBullet机器人仿真平台从零开始的完整入门指南。内容涵盖环境搭建、官方示例解析、核心操作(连接、世界与模型)、关节控制与状态读取,以及碰撞检测、传感器模拟等高级功能,帮助读者快速掌握这一强大的机器人仿真工具。

weixin_29062865的博客 1382

通过 Android Framework 调用高通 Perf HAL 实现 CPU/GPU 动态调频策略

本文详细介绍了如何通过Android Framework调用高通Perf HAL实现CPU/GPU动态调频策略。文章涵盖HAL交互原理、环境搭建、Power HAL接口实现、PerformanceHintManager应用及温度功耗平衡处理,帮助开发者安全高效地进行性能优化,避免直接操作底层硬件的风险。

keras9composer的博客 257

一致性哈希算法【图解理论 + 代码实现】

简单来说,就是比如现在我们来了一个用户请求,假如它叫张三,并被负载均衡到2号服务器上,那么2号服务器就保存了他的登录状态信息,但是如果下一次张三发出请求,他又被映射到了一号服务器上,但一号服务器上没有保存有关张三的会话信息,那么1号服务器怎么知道张三的登录状态呢?例如,服务端需要增删查看数据,如果服务端直接去数据库中查找,效率太低,所以我们需要将一些热点数据先缓存起来,以便下次查找时提高效率,假设现在我们以用户id作为。所以,综合上述的两个场景可以看出,普通的哈希算法是存在许多问题的,所以我们需要引入。

smf12138的博客 1450

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3639

27.3 一致性哈希算法介绍

hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)举例 md5sum哈希算法一致性哈希算法优点特性迁移过程底层算法导致的不均衡性。

福大大架构师每日一题 905

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6123

Android插件化和组件化面试题及参考答案

如何使用 Gradle 来管理 Android 项目中的模块依赖? Gradle 是一个强大的构建工具,在 Android 项目中管理模块依赖主要通过以下方式。 首先,在项目的根目录下的 build.gradle 文件中,需要配置仓库。一般会添加如 Google 的 Maven 仓库和 JCenter 等,例如在 repositories 部分添加: repositories { google() jcenter() } 对于模块依赖,在每个模块(例如 app

大模型大数据攻城狮的专栏 1185

一致性哈希算法介绍

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。      一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1

福星志 2512

2025.06.16【转录组】|Ribo-seq数据流程详解(二 基因组比对)

本文详细介绍了Ribo-seq数据分析中的比对流程,包括环境准备、STAR索引构建、比对参数设置及结果统计可视化。通过samtools和R脚本实现比对质量评估,提供常见问题解决方案和关键指标解读。该流程强调比对参数优化和质量控制,为后续翻译组学分析奠定基础。

1980

一致性哈希算法与Java实现

一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上, 如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数, 如果有一个机器加入或退出这个集群,则所有的数据映射都无效了。

小僧下山踏红尘 178

【27】软考软件设计师——数据流图(DFD)补全题满分精讲|下午15分大题深度拆解

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第27篇,深度精讲**下午案例题第1道必考大题:数据流图(DFD)补全**,该题单题分值高达**12 ~ 15分**,是整张试卷最稳的保底得分大题。我结合多年备考复盘与真题阅卷规则,超详细拆解DFD四大核心元素标准定义、机考绘图规范、三层分层逻辑、**父图子图平衡刚性扣分规则**,升级强化版「DFD满分补全三步法」;复刻历年高频真题完整流程,拆解缺失数据流定位、实体/存储辨析、平衡改错、文字需求对照全流程,配套**阅卷满分答题话术、机考避坑细则

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 590

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

一致性哈希算法分区

目录1. 哈希算法分区的缺点2. 一致性哈希算法2.1 一致性哈希环的概念2.2 将服务器映射到Hash环2.3 数据落入服务器规则2.4 一致性哈希算法分区优缺点2.4.1 优点2.4.2 缺点 1. 哈希算法分区的缺点 虽然哈希算法能做到数据分区,能起到负载均衡+分而治之的作用 缺点:每次扩容缩容,数据和服务器的映射关系都会发生变化,需要将所有数据进行再平衡 2. 一致性哈希算法 一致性哈希算法解决了哈希算法的问题。当服务器的数量发生变化,尽量只对部分服务器产生影响 2.1 一致性哈希环的概念 一致性H

Bulut0907 1229

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 深分页为什么慢?怎么进行优化。
下一篇: 手把手教你Spring Cloud Alibaba(一) 集成 Nacos 、Dubbo构建项目
Yiyi_Coding
博客等级 码龄1年 2粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值