关于一致性hash的讲解有很多,也不难理解,具体可以翻看其他人写的这个文章
【转】http://limitlee.iteye.com/blog/1961385
自己动手写了一个java的实现过程,记录一下。
package com.xjw.consistent.hash; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.apache.commons.codec.digest.DigestUtils; public class ConsistentHash { private SortedMap<Integer, String> serverNodeMap = null; private final static int VIRTUAL_NODE_NUMBER = 5; public void getServerNodeWithoutVirtualNode(List<String> servers) { serverNodeMap = new TreeMap<>(); for (String string : servers) { serverNodeMap.put(hash(string), string); } } public void getServerNodeWithVirtualNode(List<String> servers) { serverNodeMap = new TreeMap<>(); for (String string : servers) { for (int i = 0; i < VIRTUAL_NODE_NUMBER; i++) { String virtualNodeName = string + ":" + i; serverNodeMap.put(hash(virtualNodeName), string); } } } public String getServerName(String data) { int dataHash = hash(data); SortedMap<Integer, String> subMap = serverNodeMap.tailMap(dataHash); int serverHash = 0; if (subMap == null || subMap.size() == 0) { serverHash = serverNodeMap.firstKey(); }else { serverHash = subMap.firstKey(); } String serverName = serverNodeMap.get(serverHash); return serverName; } /** * hash计算,这里使用md5后取hashcode,这个md5需要依赖apache的codec包 * @param str * @return */ public int hash(String str) { return DigestUtils.md5Hex(str).hashCode(); } public static void main(String[] args) { List<String> servers = new ArrayList<>(); servers.add("192.168.1.1"); servers.add("192.168.1.2"); servers.add("192.168.1.3"); servers.add("192.168.1.4"); servers.add("192.168.1.5"); servers.add("192.168.1.6"); List<String> datas = new ArrayList<>(); datas.add("河南"); datas.add("山东"); datas.add("天津"); datas.add("北京"); datas.add("上海"); datas.add("广州"); datas.add("乌海"); datas.add("武汉"); datas.add("合肥"); datas.add("长沙"); ConsistentHash consistentHash = new ConsistentHash(); System.out.println("没有虚拟节点的情况:"); consistentHash.getServerNodeWithoutVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); System.out.println("有虚拟节点的情况:"); consistentHash.getServerNodeWithVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); servers.remove(0); System.out.println("移除第一个一个节点后:"); System.out.println("没有虚拟节点的情况:"); consistentHash.getServerNodeWithoutVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); System.out.println("有虚拟节点的情况:"); consistentHash.getServerNodeWithVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); } public void printDataAndServerNode(List<String> servers, List<String> datas, ConsistentHash consistentHash) { Map<String, String> result = new HashMap<>(); for (String data : datas) { String serverName = consistentHash.getServerName(data); if (!result.containsKey(serverName)) { result.put(serverName, data); }else { result.put(serverName, result.get(serverName) + "," + data); } } for (Entry<String, String> entry : result.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } } }
输出结果为:
没有虚拟节点的情况:
192.168.1.1:河南,山东,广州
192.168.1.3:天津,合肥,长沙
192.168.1.4:北京,上海,乌海
192.168.1.6:武汉
有虚拟节点的情况:
192.168.1.1:上海
192.168.1.3:河南,天津,广州
192.168.1.2:山东,北京,乌海,合肥
192.168.1.5:武汉
192.168.1.6:长沙
移除第一个一个节点后:
没有虚拟节点的情况:
192.168.1.3:河南,山东,天津,广州,合肥,长沙
192.168.1.4:北京,上海,乌海
192.168.1.6:武汉
有虚拟节点的情况:
192.168.1.3:河南,天津,广州
192.168.1.2:山东,北京,乌海,合肥
192.168.1.5:上海,武汉
192.168.1.6:长沙
相关推荐
别人写的一个一致性hash的java实现,分享下
ConsistentHash 一致性hash算法的 java 和 C++ 实现
如果没有找到,则取整个环的第个节点。测试结果测试代码是整理的,主体法没有变分布平均性测试:测试随机成的众多key是否会平均分布到各个结点上测试结果如下:最上是参
1、解决案:排序+List 2、解决案:遍历+List 1、最好情况是只有个服务器节点的Hash值于带路由结点的Hash值,其 2、最坏情况是所有服务器节点的H
一致性Hash算法,易于扩容;添加了 单元测试,使用Spring提供的RestTemplate调用RestFul风格的API接口;整合了 quartz 定时任务框架 ,并进行了封装,只需在构建完定时任务Job类后,在 application-quartz....
本文实例讲述了PHP实现的一致性Hash算法。分享给大家供大家参考,具体如下: 一致性哈希算法是分布式系统中常用的算法,为什么要用这个算法? 比如:一个分布式存储系统,要将数据存储到具体的节点(服务器)上, 在...
Hash一致性
C#一致性hash算法,性能绝对最优。结算结果和Java版本结果完全相同。
比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache ; hash(object)%N
#fly-archflylib创立的各种常见的架构技术内容列表cassandra-demo cassandra数据库的入门编程consistent-hash Java implementation of consistent-hashing基于java的一致性hash的实现一致性hash(consistent-hashing)...
将hash一致性算法使用java实现,原理参考注释。将代码拷贝到ide环境中即可
本篇文章对一致性hash算法(consistent hashing)的使用进行了详细的分析介绍。需要的朋友参考下
随着虚拟节点的增加,数据量分配就比较平均了,但是并不是虚拟节点数量越多就越好,因为要考虑这些虚拟节点带来的性能开销以及算法的复杂性;
Java Kotlin实现的一致性哈希工具 简单示例 val a = HostPortPhysicalNode("A", "192.169.1.1", 8080) val b = HostPortPhysicalNode("B", "192.169.1.2", 8080) val c = HostPortPhysicalNode("C", "192.168.1.13",...
常见算法及部分java实现。。。包括各种排序算法、红黑树、负载均衡算法、crc算法、摘要算法、对称非对称加密算法、一致性hash算法等等。。。
ConsistentHash一致性hash算法案例
引入虚拟节点,可以有效地防止物理节点(机器)映射到哈希环中出现不均匀的情况。比如上图中的机器 A、B、C 都映射在环的右半边上。一般,虚拟节点会比物理节点多很多
smart eredis 是基于ketama算法和eredis项目的redis erlang驱动,主要以一致性hash的方式存储数据,做到key的分布式存储
一致性哈希 这是环的一种无依赖Java的实现。 使用字符串作为哈希键,并使用PJW哈希变体哈希。 该实现非常快,并且具有良好的密钥分发。 var ConsistentHash = require('consistent-hash') var hr = new ...
JAVA相关技术实现,文件流操作,常用的设计模式,数据结构实现,算法应用和案例,JAVA8一些新特性新功能(Lambda用法,Steam API用法),一致性hash算法代码实现,ELK集成,Hadoop HDFS实现等