Java实现一致性Hash算法
Java代码实现了一致性Hash算法,并加入虚拟节点。,具体代码为:
package com.baijob.commonTools;import java.util.Collection;import java.util.SortedMap;import java.util.TreeMap;/*** 一致性Hash算法* 算法详解:http://blog.csdn.net/sparkliang/article/details/5279393* 算法实现:https://weblogs.java.net/blog/2007/11/27/consistent-hashing* @author xiaoleilu** @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() {@Overridepublic Integer hash(Object key) {return key.hashCode();}};//初始化节点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()), 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);//返回此映射的部分视图,其键大于等于 hashhash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();} 转载请注明小马克诚信在线http://www.shall-market.com
Java实现一致性Hash算法的更多相关文章
- Java实现一致性Hash算法深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中”一致性Hash算法”部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 一致性hash算法及java实现
一致性hash算法是分布式中一个常用且好用的分片算法.或者数据库分库分表算法.现在的互联网服务架构中,为避免单点故障.提升处理效率.横向扩展等原因,分布式系统已经成为了居家旅行必备的部署模式,所以也产 ...
- 对一致性Hash算法及java实现(转)
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 对一致性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算法,Java代码实现的深入研究
原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细 ...
- 转: memcached Java客户端spymemcached的一致性Hash算法
转自:http://colobu.com/2015/04/13/consistent-hash-algorithm-in-java-memcached-client/ memcached Java客户 ...
- 一致性Hash算法原理,java实现,及用途
学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使 ...
随机推荐
- sql快速删除所用表,视图,存储过程
[http://www.th7.cn/db/mssql/2011-07-07/10127.shtml#userconsent#] 删除用户表 .select 'DROP TABLE '+name fr ...
- mysql绿色版下载及应用
一.mysql绿色版下载 第一歩:打开下载网址:https://www.oracle.com 点击Menu-->Database and Technologies-->Databases- ...
- Java第十二次作业:继承与抽象类解决工人与学生的问题,抽象类实例。抽象类作用——为多态创造了可能。抽象类的作用总结
继承与抽象类解决工人与学生的问题 抽象类实例 package com.swift; public abstract class Person { private String name; privat ...
- cocos2dx for lua 摄像机移动
在cocos2dx中,我们想通过移动摄像机来做一些特殊处理,比如将摄像机聚焦在某个物体上,或者摄像机颤抖,摄像机原理观察sprite回收状况等等, 都需要通过相机移动来使用. cocos2dx中的摄像 ...
- 119. Pascal's Triangle II@python
Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...
- Golang 简单web测试
// mhoso project main.go package main import ( "log" "net/http" "./controll ...
- 【转】centos中service命令与/etc/init.d的关系以及centos7的变化
centos中service命令与/etc/init.d的关系 service httpd start 其实是启动了存放在/etc/init.d目录下的脚本. 但是centos7的服务管理改规则了.C ...
- MYSQL导入数据:Table XXX doesn't exist的解决
数据表为Innodb引擎 data文件夹中存在数据表的frm文件,但在phpmyadmin中看不到这些表,于是采用导入sql文件的方式进行恢复 1.直接导入原数据表的sql文件,原frm文件不删除 出 ...
- Linux虚拟机里用X11协议打开图形界面的eclipse
1.下载工具包 XLaunch(安装到win)https://xming.en.softonic.com/ Eclipse IDE for C/C++ Developers(虚拟机里解压到 /data ...
- Thinkphp5 同时连接两个库
新建api/user.php <?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/8/25 * Time: 1 ...