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算法介绍,原理,及使 ...
随机推荐
- Python -- 可迭代对象和迭代器
5.9 可迭代对象 可迭代对象: str , list , tuple , set , dict , range 1.在Python中,但凡内部有__iter__方法的对象,都是可迭代对象 2.查看对 ...
- vector总结(更新中。。。)
vector中这两个属性很容易弄混淆. size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器. capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间. ...
- Ping 命令的执行过程和应用协议
1. ICMP是“Internet Control Message Ptotocol”的缩写.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息. 控制消息是指网络通不通.主机 ...
- 【最大权闭合子图 最小割】bzoj1497: [NOI2006]最大获利
最大权闭合子图的模型:今天才发现dinic板子是一直挂的…… Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在 ...
- php 关于金额的几种计算方式
php 关于金额的几种计算方式 平常开始开发过程中,多多少少都会遇到点关于金额的计算,比如设置返利.提现手续费.折扣啊等等诸如此类的比例,然后再计算出之后的实际的费用. 下面,以折扣为例,来实现这类计 ...
- eclipse使用技巧的网站收集——转载(二)
写代码离不开文本编辑器,看代码也离不开,iar和keil编辑和阅读简直一般般了,因此使用eclipse可以看看代码,提高效率.网上有几个博客的文章,这里收集一下,以备忘. 以下文章转载自:http:/ ...
- POJ:3160-Father Christmas flymouse
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...
- Windows和linux(ubuntu)互传文件简便快捷的方法
现在很多开发和测试的工作环境都是Linux,但测试后期报告的处理一般都是在Windows下完成的,所以需要把结果拿到Windows下. 如果是同一台PC还好些(windows下安装linux的虚拟机, ...
- ROM,PROM,EPROM,EEPROM及FLASH存储器的区别
在微机的发展初期,BIOS都存放在ROM(Read Only Memory,只读存储器)中.ROM内部的资料是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进 ...
- HDU 3376 费用流 Matrix Again
题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在 ...