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算法介绍,原理,及使 ...
随机推荐
- java基础—this关键字
一.this关键字
- 科技庄园(背包dp)---对于蒟蒻来说死了一大片的奇题
题目描述: Life种了一块田,里面种了一些桃树. Life对PFT说:“我给你一定的时间去摘桃,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!” PFT思考了一会,最终答应了! 由于PF ...
- pandas删除及其映射修改操作。
1.使用drop_duplicates()函数删除重复的行 df.drop_duplicates() 2.映射 映射的含义,创建一个映射关系,把values元素和一个特定的标签或字符串绑定 map = ...
- Yii2.0学习--目录结构
目录结构: 创建一个控制器: <?php /** * Created by Haima. * Author:Haima * QQ:228654416 * Date: 2018/8/23 * Ti ...
- opencv和numpy的安装
近日,学姐让我们切割图片,查了一下资料,发现我需要安装opencv和numpy.但是在安装过程中却出现了很多小问题,我在此结合自和自己的安装经验和网上查找的资料,做一个笔记. 1.opencv的安装 ...
- 面试之mybatis和hibernate的区别
mybatis是支持普通SQL查询.存储过程和高级映射的优秀持久层框架.封装了 几乎所有的JDBC代码和参数的手工设置 ,以及结果集的检索: 封装了:1,获取连接,执行sql,释放连接. 2,sql的 ...
- Python学习笔记:xlrd和xlwt(Excel读写)
xlrd模块 Python的三方库xlrd用于对excel文件进行读取,可以是“.xls”或“.xlsx”格式(旧版本可能不支持“.xlsx”). 下载安装:https://pypi.org/proj ...
- Python入门基本语法
Python入门 以下主要讲述Python的一些基础语法,包含行的缩进在python中的重要意义,python中常见的保留字和引号的使用,如何实现单行注释和多行注释. print("he ...
- IOC容器和Bean的配置实例
实验1: <!--实验1:通过IOC容器创建对象,并为属性赋值 --> <!-- 需要由IOC容器创建对象的全类名 --> <!-- 为了便于从IOC容器中获取book对 ...
- poj-3009 curling2.0(搜索)
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26408 Accepted: 10546 Des ...