package cn.ceopen.shard.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.commons.codec.digest.DigestUtils;
/**
* 一致性hash实现
* @author 徐良永
*
* 2015年1月22日 下午2:34:05
*/
public class ConsistantHash2 {
//圆环 用treemap的主要原因是可以排序
private TreeMap<Long, Node> circle = new TreeMap<Long, Node>();
//真实结点
private List<Node> realNodes = new ArrayList<Node>();
public static void main(String[] args) {
ConsistantHash2 h = new ConsistantHash2();
h.addNode(new Node(1));
h.addNode(new Node(2));
// h.addNode(new ConsistentHash.Node(3));
// h.addNode(new ConsistentHash.Node(4));
// h.addNode(new ConsistentHash.Node(5));
// h.addNode(new ConsistentHash.Node(6));
// h.addNode(new ConsistentHash.Node(7));
// h.addNode(new ConsistentHash.Node(8));
// h.addNode(new ConsistentHash.Node(9));
for (int i = 0; i < 50; i++) {
h.getNode("" + i);
//System.out.println(i + "--->" + h.getNode("" + i));
}
}
public void addNode(Node node){
realNodes.add(node);
Long nodeKey = md5(node.toString());
System.out.println(node.toString() + " md5:" + nodeKey);
circle.put(nodeKey, node);
}
public void removeNode(Node node){
realNodes.remove(node);
Long nodeKey = md5(node.toString());
circle.remove(nodeKey);
}
/**
*
* @param key
* @return
*/
public Node getNode(String key){
//treemap 转成 排序好的map
Long keyMd5 = md5(key);
SortedMap<Long, Node> sortedMap = circle.tailMap(keyMd5);
Long k = null;
//没命中则选择第一个
if(sortedMap.isEmpty()){
k = (circle.firstKey());
System.out.println("not hit");
}else{
k = (sortedMap.firstKey());
}
Node node = circle.get(k);
//正常情况下 md5(key) < md5(node)
System.out.println(key + "(" + keyMd5 +") --->" + node.toString() + "(" + md5(node.toString()) + ")");
return node;
}
private long md5(String key){
byte[] bKey = DigestUtils.md5(key.getBytes());
long res = ((long) (bKey[3] & 0xFF) << 24) | ((long) (bKey[2] & 0xFF) << 16) | ((long) (bKey[1] & 0xFF) << 8)| bKey[0] & 0xFF;
return res;
}
static class Node{
private int nodeNum;
public Node(int num){
this.nodeNum = num;
}
@Override
public String toString(){
return "真实结点:" + nodeNum ;
}
}
}
分享到:
相关推荐
一致性哈希算法,广泛应用于分布式计算,C版实现,属于分布式服务器管理的核心算法。
一致性哈希算法
对已有的负载平衡的改进算法,通过一致性哈希算法,负载平衡更加的有效。
一致性哈希算法的php版,希望能帮到phper了解一致性哈希
#资源达人分享计划#
哈希算法 基于C# 实现的一致性哈希算法
运行平台:VS 2019 一致性哈希算法演示项目,演示新增节点key分布情况;移除节点key分布情况! C#,C#,C#.......
Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip
包 jch 提供了 Go 中 Jump Consistent Hash 一致性哈希算法的实现。 一致性哈希旨在最小化存储桶数量变化时的哈希变化,对于数据分片特别有用。 有关一致性哈希的更多信息,请访问 。 Jump Consistent Hash 由 ...
#资源达人分享计划#
Ketama算法是一致性hash算法的一个优秀实现。增删节点后数据命中率及均分率都很高。
NULL 博文链接:https://blackbeans.iteye.com/blog/1129256
12-一致性哈希分布式算法原理与实现.wmv
Mycat一致性哈希分片算法1
24一致性哈希:如何高效地均衡负载?1
通过使用nginx uri一致性哈希,将请求分发到10台缓存服务器上,总容量提升10倍,经过一致性哈希,命中率提升至999.9% 特别适合bazel服务相关的环境使用。 完整配置版本,下载后可直接启动使用。 1.sh bazel-remote...
基于动态转移的分布式缓存系统一致性哈希算法改进,张昊,张永军,近年来,随着大数据与分布式集群的广泛应用,一致性哈希算法在分布式缓存系统的负载均衡中得到了广泛的应用。一致性哈希算法虽然
* 有两种方案,第一种普通hash分布,第二种一致性哈希分布 * * 普通hash分布 * 首先将key处理为一个32位字符串,取前8位,在经过hash计算处理成整数并返回,然后映射到其中一台服务器 * $servers[$this->...
#资源达人分享计划#
本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及 其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题 场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接...