package com.test; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; public class ConsistentHash<T> { private final HashFunction hashFunction;/** Hash计算对象,用于自定义hash算法 */ private final int numberOfReplicas;/** 复制的节点个数 */ private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();/** 一致性Hash环 */ public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,Collection<T> nodes) { this.hashFunction = hashFunction; this.numberOfReplicas = numberOfReplicas; 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(hashFunction.hash(node.toString() + i), node); } } /** * 移除节点的同时移除相应的虚拟节点 * @param node 节点对象 */ public void remove(T node) { for (int i = 0; i < numberOfReplicas; i++) { circle.remove(hashFunction.hash(node.toString() + i)); } } /** * 获得一个最近的顺时针节点 * @param key 为给定键取Hash,取得顺时针方向上最近的一个虚拟节点对应的实际节点 * @return 节点对象 */ public T get(Object key) { if (circle.isEmpty()) { return null; } int hash = hashFunction.hash(key); // System.out.println("hash---: " + hash); if (!circle.containsKey(hash)) { //返回此映射的部分视图,其键大于等于 hash SortedMap<Integer, T> tailMap = circle.tailMap(hash); hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); } // System.out.println("hash---: " + hash); return circle.get(hash); } /*** * 自定义HASH算法 * */ static class HashFunction { int hash(Object key) { // md5加密后,hashcode return MD5Encrypt.encode(key.toString()).hashCode(); } } public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("A"); set.add("B"); set.add("C"); set.add("D"); Map<String, Integer> map = new HashMap<String, Integer>(); ConsistentHash<String> consistentHash = new ConsistentHash<String>(new HashFunction(), 1000, set); int count = 10000; for (int i = 0; i < count; i++) { String key = consistentHash.get(i); if (map.containsKey(key)) { map.put(consistentHash.get(i), map.get(key) + 1); } else { map.put(consistentHash.get(i), 1); } // System.out.println(key); } showServer(map); map.clear(); consistentHash.remove("A"); System.out.println("------- remove A"); for (int i = 0; i < count; i++) { String key = consistentHash.get(i); if (map.containsKey(key)) { map.put(consistentHash.get(i), map.get(key) + 1); } else { map.put(consistentHash.get(i), 1); } // System.out.println(key); } showServer(map); map.clear(); consistentHash.add("E"); System.out.println("------- add E"); for (int i = 0; i < count; i++) { String key = consistentHash.get(i); if (map.containsKey(key)) { map.put(consistentHash.get(i), map.get(key) + 1); } else { map.put(consistentHash.get(i), 1); } // System.out.println(key); } showServer(map); map.clear(); consistentHash.add("F"); System.out.println("------- add F服务器 业务量加倍"); count = count * 2; for (int i = 0; i < count; i++) { String key = consistentHash.get(i); if (map.containsKey(key)) { map.put(consistentHash.get(i), map.get(key) + 1); } else { map.put(consistentHash.get(i), 1); } // System.out.println(key); } showServer(map); } public static void showServer(Map<String, Integer> map) { for (Entry<String, Integer> m : map.entrySet()) { System.out.println("服务器 " + m.getKey() + "----" + m.getValue() + "个"); } } }
相关推荐
一致性hash应用于负载均衡算法,本实现由C++语言开发。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance)2、单调性(Monotonicity) 3、分散性(Spread)4、负载(Load)
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,旨在解决在分布式环境中数据分布不均匀的问题。Ketama算法是基于一致性哈希的一种优化实现,由Last.fm公司的Simon Willison提出,其目标是在...
### 一致性Hash算法的原理及实现 #### 一、引言 一致性Hash算法是一种用于解决分布式环境下数据存储和检索问题的重要技术。它最初由David Karger等人在1997年的论文《Consistent Hashing and Random Trees: ...
【一致性Hash算法】是一种分布式系统中用于负载均衡的哈希算法。它的主要目的是解决当服务节点增加或减少时,能够尽量少地改变已有的请求分配,以保持系统的稳定性。在传统的哈希算法中,增加或删除一个服务器可能...
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它在处理大量数据分布到多个节点上时,能保持较好的均衡性和可扩展性。在C/C++编程中,一致性哈希通常用于构建分布式系统,如负载均衡、缓存...
一致性hash算法简介
一致性hash算法简介加C++实现
基于go语言实现的分布式缓存系统源码+项目说明(以键值对的形式存储数据,一致性hash算法选择存储节点,Protobuf通信协议编解码。用户输入查询请求后,会优先在缓存系统查询,查不到则使用回调函数去源数据库查询,...
一致性哈希算法(Consistent Hashing)是一种在分布式系统中平衡数据分布的策略,尤其适用于缓存服务如Memcached或Redis。它的核心思想是通过哈希函数将对象映射到一个固定大小的环形空间中,然后将服务器也映射到这个...
为了解决这个问题,可以采用跳数法(Jump Consistent Hash)或者更高级的一致性哈希变体,如Ketama或libketama。哈希冲突则可以通过开放寻址、链地址法等方法来解决。 此外,一致性哈希算法在分布式缓存如Memcached...
一致性Hash算法,易于扩容;添加了 单元测试,使用Spring提供的RestTemplate调用RestFul风格的API接口;整合了 quartz 定时任务框架 ,并进行了封装,只需在构建完定时任务Job类后,在 application-quartz....
主要介绍了PHP实现的一致性Hash算法,结合实例形式详细分析了php一致性Hash算法的概念、原理及相关实现与使用技巧,需要的朋友可以参考下
一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,设计目的是为了在分布式缓存系统中解决节点动态增减时导致的数据分布不均问题。该算法最早在1997年的论文《Consistent Hashing and Random Trees》中被...
一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,设计目的是为了在分布式缓存系统中解决节点动态增减时导致的键值映射大量变更的问题。它最早在1997年的论文《Consistent hashing and random trees》中被...
一致性哈希算法是一种分布式哈希技术,用于解决在分布式缓存、负载均衡系统等场景下节点动态增减时,数据分布的稳定性和效率问题。它最初由麻省理工学院在1997年提出,目的是解决分布式缓存系统中如何均匀分配数据的...
一致性哈希算法是一种分布式系统中负载均衡的策略,它的核心思想是解决在分布式环境中如何将数据均匀地分配到各个节点的问题。Google Maglev论文中提出的一致性哈希算法是为了解决大型数据中心的网络路由问题,使得...