java实现一致性hash算法实例代码
一致性hash算法java版本简单实现
packagecom.java4all.grouth.consistent;
importjava.util.LinkedList;
importjava.util.List;
importjava.util.SortedMap;
importjava.util.TreeMap;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
/**
*一致性hash算法java简易实现
*@authorIT云清
*参考:https://blog.csdn.net/zhanglu0223/article/details/100579254
*/
publicclassConsistentHash{
privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(ConsistentHash.class);
/**
*虚拟节点个数
*每个真实节点对应的虚拟节点个数
*/
privatestaticfinalintVIRTUAL_NUM=5;
/**
*虚拟节点
*eg:<656715414,192.168.1.1&&VN3>
*真实节点数量一般偏少,引入虚拟节点来平衡
*每个真实节点对应多个虚拟节点,这样每个节点尽可能在hash环上均匀分布,可以根据虚拟节点找到真实节点
*/
privatestaticSortedMapshards=newTreeMap<>();
/**
*真实节点
*/
privatestaticListrealNodes=newLinkedList<>();
/**
*模拟初始节点
*/
privatestaticString[]servers={"116.116.1.1","116.116.1.2","116.116.1.3","116.116.1.5","116.116.1.6"};
/**
*初始化虚拟节点
*/
static{
for(Stringserver:servers){
realNodes.add(server);
LOGGER.info("添加真实节点{}",server);
for(inti=0;itailMap=shards.tailMap(hash);
//获取在hash环上右侧最近的虚拟节点的key
key=tailMap.isEmpty()?shards.lastKey():tailMap.firstKey();
//根据hash获取虚拟节点
StringvirtualNode=shards.get(key);
//返回虚拟节点的真实ip
returnvirtualNode.substring(0,virtualNode.indexOf("&&"));
}
/**
*添加节点
*@paramnode
*/
publicstaticvoidaddNode(Stringnode){
if(!realNodes.contains(node)){
realNodes.add(node);
LOGGER.info("新增真实节点上线,{}",node);
for(inti=0;i>7;
hash+=hash<<3;
hash^=hash>>17;
hash+=hash<<5;
//如果算出来的值为负数则取其绝对值
if(hash<0){
hash=Math.abs(hash);
}
returnhash;
}
}
到此这篇关于java实现一致性hash算法的文章就介绍到这了,更多相关java实现一致性hash算法内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!