一致性Hash算法与代码实现
一致性Hash算法:
先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。
数据结构的选取

| 50000 | 100000 | 500000 | 1000000 | 4000000 | |
| ArrayList | 1ms | 1ms | 4ms | 4ms | 5ms |
| LinkedList | 4ms | 7ms | 11ms | 13ms | 17ms |
| TreeMap | 0ms | 0ms | 0ms | 0ms | 0ms |
public class ConsistanHash {
private static SortedMap<Integer, String> sortedMap = new TreeMap<Integer, String>();
static {
String[] dbs = {"192.168.0.0:111", "192.168.0.1:111", "192.168.0.2:111",
"192.168.0.3:111", "192.168.0.4:111"};
for (int i = 0; i < dbs.length; i++) {
int hash = HashAlgorithms.FNVHash1(dbs[i]);
sortedMap.put(hash, dbs[i]);
}
}
//不带虚拟节点
public static String getDB(String node){
// 得到该路由的hash 值
int hash =HashAlgorithms.FNVHash1(node);
// 得到大于该hash值得所有map
SortedMap<Integer,String> subMap=sortedMap.tailMap(hash);
String dbNode="";
// 第一个key就是顺时针node最近的节点
// 没命中则选择第一个
if(subMap.isEmpty()){
Integer i=sortedMap.firstKey();
dbNode=sortedMap.get(i);
}else{
Integer i = subMap.firstKey();
dbNode = subMap.get(i);
}
return dbNode;
}
}

/**
* Created by Demon on 2017/6/13.
* 带虚拟节点的一致性Hash算法
*/
public class ConsistentHashVirtualNode {
/**
* 待添加入Hash环的服务器列表
*/
private static String[] servers = {"192.168.0.0:111", "192.168.0.1:111", "192.168.0.2:111",
"192.168.0.3:111", "192.168.0.4:111"};
//真实结点列表,考虑到服务器上线、下线的场景,即添加、删除的场景会比较频繁,这里使用LinkedList会更好
private static List<String> readlNodes = new LinkedList<String>();
/**
* 虚拟节点,key表示虚拟节点的hash值,value表示虚拟节点的名称
*/
private static SortedMap<Integer, String> virtualNodes = new TreeMap<Integer, String>();
/**
* 虚拟节点的数目,这里写死,为了演示需要,一个真实结点对应5个虚拟节点
*/
private static final int VIRTUAL_NODES = 5;
static {
// 先把原始的服务器添加到真实结点列表中
for (int i = 0; i < servers.length; i++) {
readlNodes.add(servers[i]);
}
// 再添加虚拟节点
for (String readlNode : readlNodes) {
for (int i = 0; i < VIRTUAL_NODES; i++) {
String virtualNodeName = readlNode + "&&VN" + String.valueOf(i);
int hash = HashAlgorithms.FNVHash1(virtualNodeName);
virtualNodes.put(hash, virtualNodeName);
}
}
}
public static String getServer(String node) {
int hash = HashAlgorithms.FNVHash1(node);
// 得到大于该Hash值的所有Map
SortedMap<Integer, String> subMap = virtualNodes.tailMap(hash);
String virtualNode = "";
if (subMap.isEmpty()) {
// 第一个Key就是顺时针过去离node最近的那个结点
Integer i = virtualNodes.firstKey();
// 返回对应的虚拟节点名称,这里字符串稍微截取一下
virtualNode = virtualNodes.get(i);
}else{
Integer i = subMap.firstKey();
virtualNode = virtualNodes.get(i);
}
// 得到带路由的结点的Hash值
return virtualNode.substring(0, virtualNode.indexOf("&&"));
}
}
一致性Hash算法与代码实现的更多相关文章
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 一致性hash算法简介与代码实现
一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...
- 一致性Hash算法原理及C#代码实现
一.一致性Hash算法原理 基本概念 一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下: 整个空间按顺 ...
- 对一致性Hash算法,Java代码实现的深入研究(转)
转载:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读 ...
- 【转载】对一致性Hash算法,Java代码实现的深入研究
原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细 ...
- 【策略】一致性Hash算法(Hash环)的java代码实现
[一]一致性hash算法,基本实现分布平衡. package org.ehking.quartz.curator; import java.util.SortedMap; import java.ut ...
- 一致性 hash 算法( consistent hashing )a
一致性 hash 算法( consistent hashing ) 张亮 consistent hashing 算法早在 1997 年就在论文 Consistent hashing and rando ...
- memcache的一致性hash算法使用
一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的k ...
- 一致性Hash算法在Redis分布式中的使用
由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢? ...
随机推荐
- 最新的css3动画按钮效果
效果演示 插件下载
- 配置RMAN备份环境
关于配置RMAN备份环境你可以给每个目标数据库设置一些固定的配置,这些配置控制着RMAN多个方面的行为.例如,你可配置备份的保存策略.默认的备份目录.默认的备份设备类型等.你可以用show命令来查看配 ...
- poj2100还是尺取
King George has recently decided that he would like to have a new design for the royal graveyard. Th ...
- centos下安装dubbo-admin步骤
前言: 纠正网上一些错误的博文,真的害人不浅,按照他们的说法,dubbo-admin在jdk1.8的版本下无法启动注册中心,需要去github下载阿里提供的源码,然后install进本地仓库并打包成w ...
- 自动化运维:使用psutil和paramiko读取远程主机信息
1.前言 今天大致看了下自动化运维的东西,里面介绍到了psutil模块,其封装了linux 下的大部分shell命令,用起来比较方便.但是基本都是介绍在本地如何使用,而实际情况大家很少这样使用,一般 ...
- hdu2612 Find a way BFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 思路: 裸的BFS,对于Y,M分别进行BFS,求出其分别到达各个点的最小时间: 然后对于@的点, ...
- 0基础搭建Hadoop大数据处理-编程
Hadoop的编程可以是在Linux环境或Winows环境中,在此以Windows环境为示例,以Eclipse工具为主(也可以用IDEA).网上也有很多开发的文章,在此也参考他们的内容只作简单的介绍和 ...
- RecyclerView添加头部和底部视图的实现方法
引用-- http://www.zhimengzhe.com/Androidkaifa/15072.html 在天下货crm----签到---签到记录中有使用
- How to change current process to background process
Situation: there is a script or command is running, but we need to close current box/windows to do o ...
- Zookeer-- 上搭建 hbase
一.HBase的相关概念1.HBase的概念:大量数据进行随机近实时读写时使用Hbase.2.HBase是一个模仿Gootable's Bigtable的,开源的.分布式的.版本化的非关系型数据库.3 ...