什么是一致性哈希一致性哈希算法(ConsistentHashingAlgorithm)是一种分布式算法,常用于负载均衡。Memcachedclient也是选择这个算法来解决key-values均匀分布到很多Memcachedserver的问题。可以替代传统的取模运算,解决取模运算无法应对MemcachedServer增删改查的问题(增删server会导致key相同,无法分配实际存放数据的server)在get操作过程中,命中率会急剧下降)。一致性哈希将整个哈希值空间组织成一个虚拟环,比如假设某个哈希函数H的值空间为0-2^32-1(即哈希值为32位无符号整数)。整个空间按顺时针方向组织,0和232-1在零点重合。一致性哈希有什么用在分布式缓存服务中常使用一致性哈希算法,对所有服务节点进行哈希计算,得到在哈希环上的位置。添加到服务中的数据使用相同的算法进行哈希处理,然后从哈希环中获取第一个大于哈希值的节点。如果没有节点大于该值,则取整个环的第一个节点。节点太少时会出现问题,可能会出现hashoffset。即节点负载不均衡,大量数据落在其中一个节点上。解决方法是在环上虚拟出足够多的节点,虚拟节点与实际节点一一对应。java代码实现包com.hj.lock.alg;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.*;publicclassConsistentHash{/***Customhash的Hash计算对象算法*/HashFunchashFunc;/***复制节点数*/privatefinalintnumberOfReplicas;/***一致性哈希环*/privatefinalTreeMaphashCircle=newTreeMap<>();/***构造,使用Java默认的Hash算法**@paramnumberOfReplicas复制节点的个数,增加每个节点的复制节点有利于负载均衡*@parampublicConsistentHash(intnumberOfReplicas,Collectionnodes){this.numberOfReplicas=numberOfReplicas;this.hashFunc=ConsistentHash::md5HashingAlg;//初始化节点nodes.forEach(node->add(node));}/***添加节点
*每添加一个节点,都会增加给定的闭环复制节点数
*比如复制节点数为2,每次这样方法被调用,会添加两个虚拟节点,这两个节点指向同一个Node*由于hash算法会调用节点的toString方法,所以根据toString去重**@parampublicvoidadd(Tnode){for(inti=0;i>7;散列+=散列<<3;哈希^=哈希>>17;散列+=散列<<5;返回散列;}/***哈希算法对象,用于自定义哈希算法*/publicinterfaceHashFunc{publicLonghash(Objectkey);}publicstaticvoidmain(String[]args){Listnodes=newArrayList<>();系统输出。println("--添加节点ABC");nodes.add("A");节点.add("B");节点.add("C");ConsistentHashchash=newConsistentHash(1,节点);System.out.println(chash.get("test1"));System.out.println(chash.get("aest2"));System.out.println(chash.get("dest3"));System.out.println("--添加节点D");chash.add("D");System.out.println(chash.get("test1"));System.out.println(chash.get("aest2"));System.out.println(chash.get("dest3"));对于(迭代器>it=chash.hashCircle.entrySet().iterator();它.hasNext();){Map.Entryentry=it.next();Longk=entry.getKey();System.out.println(k+":"+entry.getValue());System.out.println(Math.abs(chash.nextHash(k+1)-k));}}}以上代码输出值:--添加节点ABCCCA--添加节点DDCA748451404:B10816119161830063320:A15425661983372629518:D4919858063864615324:C3116163920参考https://img.ydisp.cn/2jdls/12