package com.hash;

import java.util.Collection;

import java.util.SortedMap;

import java.util.TreeMap;

/**

 * 一致性Hash算法

 *

 * @param <T>
节点类型

 */

public class ConsistentHash<T> {


/** Hash计算对象,用于自定义hash算法 */


HashFunc hashFunc;


/** 复制的节点个数 */


private final int numberOfReplicas;


/** 一致性Hash环 */


private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();

/**


* 构造,使用Java默认的Hash算法


* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡


* @param nodes 节点对象


*/


public ConsistentHash(int numberOfReplicas, Collection<T> nodes) {


this.numberOfReplicas = numberOfReplicas;


this.hashFunc =new HashFunc(){


@Override


public Integer hash(Object key) {


return hashFunc.hash(key);


}};

//初始化节点


for (T node : nodes) {


add(node);


}


}

/**


* 构造


* @param hashFunc hash算法对象


* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡


* @param nodes 节点对象


*/


public ConsistentHash(HashFunc hashFunc, int numberOfReplicas, Collection<T> nodes) {


this.numberOfReplicas = numberOfReplicas;


this.hashFunc = hashFunc;


//初始化节点


for (T node : nodes) {


add(node);


}


}

/**


* 增加节点<br>


* 每增加一个节点,就会在闭环上增加给定复制节点数<br>


* 例如复制节点数是2,则每调用此方法一次,增加两个虚拟节点,这两个节点指向同一Node


* 由于hash算法会调用node的toString方法,故按照toString去重


* @param node 节点对象


*/


public void add(T node) {


for (int i = 0; i < numberOfReplicas; i++) {


circle.put(hashFunc.hash(node.toString() + i), node);


}


}

/**


* 移除节点的同时移除相应的虚拟节点


* @param node 节点对象


*/


public void remove(T node) {


for (int i = 0; i < numberOfReplicas; i++) {


circle.remove(hashFunc.hash(node.toString() + i));


}


}

/**


* 获得一个最近的顺时针节点


* @param key 为给定键取Hash,取得顺时针方向上最近的一个虚拟节点对应的实际节点


* @return 节点对象


*/


public T get(Object key) {


if (circle.isEmpty()) {


return null;


}


int hash = hashFunc.hash(key);


if (!circle.containsKey(hash)) {


SortedMap<Integer, T> tailMap = circle.tailMap(hash);

//返回此映射的部分视图,其键大于等于 hash


hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();


}


//正好命中


return circle.get(hash);


}

/**


* Hash算法对象,用于自定义hash算法


*


*/


public interface HashFunc {


public Integer hash(Object key);


}

}

java 一致性哈希类实例 算法的更多相关文章

  1. 深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现

    转自:https://my.oschina.net/yaohonv/blog/1610096 本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和J ...

  2. 一致性哈希(consistent hashing)算法

    文章同步发表在博主的网站朗度云,传输门:http://www.wolfbe.com/detail/201608/341.html 1.背景        我们都知道memcached服务器是不提供分布 ...

  3. Java反射特性--获取其他类实例并调用其方法

    1. 代码结构 .├── com│   └── test│   └── MyTest.java└── MainCall.java 2. 代码内容 MyTest.java: package com.te ...

  4. 类实例调用静态方法(Java)

    前言 第一次看到在Java中是可以通过类实例调用静态方法,当然不推荐这么做,接下来会讲到,但是在C#中通过类实例调用静态方法在编译时就不会通过,这里做下记录. 类实例调用静态方法 首先我们来看一个简单 ...

  5. 浅谈一致性哈希(My转)

    一致性哈希(Consistent hashing)算法是由 MIT 的Karger 等人与1997年在一篇学术论文(<Consistent hashing and random trees: d ...

  6. Dubbo一致性哈希负载均衡的源码和Bug,了解一下?

    本文是对于Dubbo负载均衡策略之一的一致性哈希负载均衡的详细分析.对源码逐行解读.根据实际运行结果,配以丰富的图片,可能是东半球讲一致性哈希算法在Dubbo中的实现最详细的文章了. 文中所示源码,没 ...

  7. Java_一致性哈希算法与Java实现

    摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  8. 一致性哈希算法学习及JAVA代码实现分析

    1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...

  9. 一致性哈希算法原理及Java实现

     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...

随机推荐

  1. WCF部署到IIS异常(详细: 不能加载类型System.ServiceModel.Activation.HttpModule )

    未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“ ...

  2. PHP框架学习之Laravel安装

    自从接触PHP以来一直使用Yii,感觉Yii实现功能比较简单,是一个很不错的框架.最近由于工作的原因开始研究Laravel5,不得不说我在第一步安装就被坑着了,下面就是我痛苦的学习成果.Laravel ...

  3. ubuntu下lnmp的安装

    适用于ubuntu14.04和源是14.04的ubuntu上安装nginx(我学在线Moodle工作室---注这里安装的是最新版的nginx,并且解决pathinfo问题,特别适用于Moodle安装) ...

  4. SQL SERVER 2008 架构

    架构: 一个容器 包含表,视图,数据库对象等等. 相当于命名空间 如何创建一个架构: 1. 图形向导 2.命令 create schema 在sqlserver 2005中,可能大家在工作或学习的时候 ...

  5. [C#]6.0新特性浅谈

    原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...

  6. POJ——放苹果

    4:放苹果 查看 提交 统计 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示) ...

  7. 初识Java--线程同步(2)

    本文讲述Java中的线程同步和生产者消费者问题,其中主要涉及线程同步和wait().notify()方法的用法. wait和notify方法只能用在线程同步中,wait和notify是object的方 ...

  8. Net常用命名空间和类介绍

    一.基础命名空间 l  System.Collections 包含了一些与集合相关的类型,比如列表,队列,位数组,哈希表和字典等. l  System.IO 包含了一些数据流类型并提供了文件和目录同步 ...

  9. bootstrap注意事项(八)一些辅助信息

    1.三角符号 通过使用三角符号可以指示某个元素具有下拉菜单的功能.注意,向上弹出式菜单中的三角符号是反方向的. <!DOCTYPE HTML><html><head> ...

  10. 【整理】SQLServer查询各种数据库对象(表,索引,视图,图表,存储过程等)

    首先明确数据库对象的定义:数据库对象定义数据库内容的结构.它们包含在数据库项目中,数据库项目还可以包含数据生成计划和脚本. 常见的数据库对象包括:表,索引,视图,图表,缺省值,规则,触发器,存储过程, ...