`
Kanepan
  • 浏览: 825 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一致性哈希算法 JAVA 实现(用于分布式)

 
阅读更多
     网上找了那么多文章,都是一致性hash算法的原理,居然一个完全用JAVA实现的版本都没有。好吧不多说,直接上代码。

public class ConsistentHash<T> {

       private final HashFunction hashFunction;
       private final int numberOfReplicas;
       private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();

       public ConsistentHash(HashFunction hashFunction, int numberOfReplicas, Collection<T> nodes) {
             this .hashFunction = hashFunction;
             this .numberOfReplicas = numberOfReplicas;

             for (T node : nodes) {
                  add(node);
            }
      }

       public void add(T node) {
             for (int i = 0; i < numberOfReplicas; i++) {
                   circle .put(hashFunction .hash(node.toString() + i), node);
            }
      }

       public void remove(T node) {
             for (int i = 0; i < numberOfReplicas; i++) {
                   circle .remove(hashFunction .hash(node.toString() + i));
            }
      }

       public T get(Object key) {
             if (circle .isEmpty()) {
                   return null ;
            }
             int hash = hashFunction .hash(key);
             // System.out.println("hash---: " + hash);
             if (!circle .containsKey(hash)) {
                  SortedMap<Integer, T> tailMap = circle .tailMap(hash);
                  hash = tailMap.isEmpty() ? circle .firstKey() : tailMap.firstKey();
            }
             // System.out.println("hash---: " + hash);
             return circle .get(hash);
      }

       static class HashFunction {
             int hash(Object key) {
                   //md5加密后,hashcode
                   return Md5Encrypt.md5(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() + "个" );
            }
      }

}


运行结果 :
服务器 D----2630个
服务器 A----2453个
服务器 B----2340个
服务器 C----2577个
------- remove A服务器
服务器 D----3489个
服务器 B----3107个
服务器 C----3404个
------- add E服务器
服务器 D----2572个
服务器 E----2469个
服务器 B----2361个
服务器 C----2598个
------- add F服务器  业务量加倍
服务器 D----4011个
服务器 E----4050个
服务器 F----3848个
服务器 B----3956个
服务器 C----4135个

numberOfReplicas 是虚拟服务器系数, 越大分布越均衡,但越大,在初始化和变更的时候效率差一点。  测试中,设置200基本就均衡了。
分享到:
评论

相关推荐

    基于一致性哈希算法的分布式数据库高效扩展方法.pdf

    一致性哈希算法最初由麻省理工学院的K等人提出,并被广泛应用于分布式系统中,以解决节点动态变化时数据一致性问题。其核心思想是通过引入哈希环,将数据对象均匀分布在哈希环上的不同节点中,以此降低节点变更对...

    一致性哈希算法在分布式系统中的应用.pdf

    一致性哈希算法是一种在分布式系统中用于解决数据分发和负载均衡问题的算法。随着互联网技术的快速发展,分布式系统已经成为支撑大规模服务的关键技术之一。在分布式系统中,多个节点通过网络协同工作,提供高可用性...

    分布式存储系统中改进的一致性哈希算法.pdf

    一致性哈希算法是在分布式系统中广泛使用的一种数据定位算法,尤其适用于分布式缓存系统,如Redis。传统的哈希算法在分布式存储系统中有一个缺点,即当系统扩展或缩减节点时,数据的迁移量过大。一致性哈希算法通过...

    一致性哈希算法(ketama hashing)

    一致性哈希算法(Consistent Hashing)是一种在分布式系统中实现负载均衡的算法,尤其在分布式缓存如Memcached和Redis等场景下广泛使用。它解决了传统哈希算法在节点增减时导致的大量数据迁移问题,提高了系统的可用...

    一致性哈希算法及其在分布式系统中的应用

    一致性哈希算法是一种用于解决分布式系统中节点动态变化导致的数据重新分布问题的关键技术。它通过将哈希空间映射到一个循环的空间中,实现了数据节点的高效定位,并有效减少了节点加入或离开系统时引起的数据迁移量...

    一致性哈希算法C版实现

    一致性哈希算法是一种在分布式系统中解决数据分片和负载均衡问题的算法,它主要解决了在动态添加或移除节点时,...总之,一致性哈希算法是分布式计算中的一个重要工具,通过巧妙的设计实现了高效的数据分布和动态扩展。

    基于一致性哈希算法的分布式数据库高效扩展方法研究.pdf

    【摘要】中的“高效扩展”和“分布式数据库”是本文的核心话题,研究的是如何利用一致性哈希算法在大数据时代高效地扩展分布式数据库。一致性哈希算法最初由Karger等人提出,目的是解决分布式缓存的问题,它弥补了...

    基于C# 实现的一致性哈希算法

    一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它解决了在分布式环境中数据分片和负载均衡的问题。在传统的哈希算法中,如果增加或减少服务器节点,会导致大量数据重新分配,而一致性哈希...

    一致性哈希算法源码 Ketama一致性hash算法源码

    总的来说,Ketama一致性哈希算法是分布式系统中解决数据分布问题的重要工具,通过巧妙的设计实现了在节点变化时尽可能少的数据迁移,提高了系统的稳定性和扩展性。通过深入理解并运用这种算法,我们可以构建更加健壮...

    一致性哈希算法演示.rar

    一致性哈希算法是一种分布式哈希表(DHT)中用于解决数据分片和负载均衡问题的算法。在大型分布式系统中,例如缓存系统、分布式数据库等,一致性哈希能够确保当节点加入或离开时,尽可能少的数据需要迁移,从而保持...

    分布式存储系统中一致性哈希算法的研究.pdf

    一致性哈希算法由David Karger等人在1997年提出,它是一种特殊的哈希算法,主要用于分布式系统中实现负载均衡。与传统的哈希算法不同,一致性哈希算法在处理节点增减时,能够最小化重新分配数据的数量,从而提高系统...

    ufire-springcloud-platform:基于一致性哈希算法实现websocket分布式扩展的尝试,提供模拟停机机演示解决单点故障演示,实现websocket服务的扩展容限。基于jenkins + github hook + docker-compose实现自动化持续部署

    本文将探讨一个名为"ufire-springcloud-platform"的项目,该项目是基于一致性哈希算法实现WebSocket分布式扩展的一次尝试,并结合Jenkins、GitHub Hook和Docker Compose实现了自动化持续部署。 1. **一致性哈希算法...

    一致性hashjava实现

    在这个Java实现中,我们看到的是Ketama一致性哈希算法,这是一种在实践中广泛应用的一致性哈希变体。 Ketama一致性哈希算法由Last.fm的工程师开发,其设计目标是优化分布式哈希表的性能,特别是在处理大量小键值对...

    深入探讨一致性哈希:分布式系统中的应用与优势

    一致性哈希(Consistent Hashing)是一种特殊的哈希算法,它在分布式缓存和负载均衡等场景中被广泛应用。它通过将数据和服务器节点映射到一个哈希环上,提供了一种在节点增减时能够最小化数据重新分配的机制。本文将...

    Ketama一致性Hash算法(含Java代码) 1

    一致性哈希算法(Consistent Hashing)是一种在分布式系统中平衡数据分布的策略,尤其适用于缓存服务如Memcached或Redis。它的核心思想是通过哈希函数将对象映射到一个固定大小的环形空间中,然后将服务器也映射到这个...

    一个java实现的分布式文件存储系统,可以实现文件分布存储在不同的服务器中,进行上传、下载、删除

    Java实现的分布式文件存储系统,如"ctjdfs",提供了一种在多台服务器之间分散存储、管理和访问文件的方法,从而解决了单点存储的性能瓶颈和容错问题。下面我们将详细探讨这个系统的关键知识点。 首先,"ctjdfs"是...

    一致性哈希算法应用及优化(最简洁明了的教程)

    一致性哈希算法应用及优化是IT领域中分布式系统设计的核心技术之一,特别是在处理大规模数据分布与缓存系统中,其重要性不言而喻。本文将深入探讨一致性哈希算法的基本概念、工作原理以及在实际场景中的应用和优化...

    基于Spring Boot框架的分布式缓存系统.zip

    1. 一致性哈希算法通过一致性哈希算法实现数据的分布式存储,确保在节点增减时仅影响少量数据,保持数据访问的一致性。 2. 虚拟节点引入虚拟节点机制,解决数据倾斜问题,使数据分布更加均匀。 3. 多种哈希算法支持...

    解决分布式数据插入数据库~一致性hash算法

    一致性哈希算法(Consistent Hashing)是一种常用于分布式系统中的数据分片策略,它有效地解决了数据在多台服务器间均匀分布的问题,同时减少了因节点加入或离开时的数据迁移成本。 首先,一致性哈希的基本原理是将...

Global site tag (gtag.js) - Google Analytics