写点什么

架构师训练营第五周课后作业

用户头像
万有引力
关注
发布于: 2020 年 12 月 26 日

源代码链接

https://repl.it/@attrany/StrikingLooseShoutcast#Main.java

测试执行结果

随机KEY:100万

物理节点:10个

  • 虚拟节点系数:1(无虚拟节点)

  • 第一次标准差:78719.13

  • 第二次标准差:78871.29

  • 第三次标准差:78834.83

  • 虚拟节点系数:5

  • 第一次标准差:36770.64

  • 第二次标准差:36515.79

  • 第三次标准差:36579.51

  • 虚拟节点系数:10

  • 第一次标准差:31160.41

  • 第二次标准差:31100.10

  • 第三次标准差:31093.50

  • 虚拟节点系数:50

  • 第一次标准差:17012.96

  • 第二次标准差:17247.05

  • 第三次标准差:17230.51

  • 虚拟节点系数:100

  • 第一次标准差:10755.34

  • 第二次标准差:10769.83

  • 第三次标准差:10627.47

  • 虚拟节点系数:500

  • 第一次标准差:4328.12

  • 第二次标准差:4444.74

  • 第三次标准差:4313.12

  • 虚拟节点系数:1000

  • 第一次标准差:2303.66

  • 第二次标准差:2273.83

  • 第三次标准差:2186.75



一致性哈希核心代码

import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.util.TreeMap;
import java.util.SortedMap;
public class ConsistentHashService {
final private static long ring = 1L << 32;
private int virtualNodeNums = 10;
private HashSet<String> servers;
private TreeMap<Long, String> nodeHashMap;
public ConsistentHashService() {
servers = new HashSet<>();
nodeHashMap = new TreeMap<>();
}
public void setVirtualNodeNum(int nodeNum) {
this.virtualNodeNums = nodeNum;
}
public void addServers(List<String> serverList) {
int serverCount = servers.size();
for(String server : serverList) {
servers.add(server);
}
if(serverCount != servers.size()) {
rebuildVirtualNodes();
}
}
public void removeServers(List<String> serverList) {
int serverCount = servers.size();
for(String server : serverList) {
servers.remove(server);
}
if(serverCount != servers.size()) {
rebuildVirtualNodes();
}
}
public void rebuildVirtualNodes() {
TreeMap<Long, String> newHashMap = new TreeMap<>();
for(String server : servers) {
for(int i = 0; i < virtualNodeNums; i++) {
String v = server + "__VN__" + i;
Long hash = getHash(v) % ring;
// System.out.println(hash + ":" + server);
newHashMap.put(hash, server);
}
}
nodeHashMap = newHashMap;
}
private Long getHash(String key) {
final int p = 16777619;
Long hash = 2166136261L;
for (int idx = 0, num = key.length(); idx < num; ++idx) {
hash = (hash ^ key.charAt(idx)) * p;
}
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5;
if (hash < 0) {
hash = Math.abs(hash);
}
return hash;
}
public String getServer(String key) {
Long keyHash = getHash(key) % ring;
SortedMap<Long, String> tailMap = nodeHashMap.tailMap(keyHash);
Long nodeHash = tailMap.isEmpty() ? nodeHashMap.firstKey() : tailMap.firstKey();
return nodeHashMap.get(nodeHash);
}
}



发布于: 2020 年 12 月 26 日阅读数: 15
用户头像

万有引力

关注

还未添加个人签名 2018.05.30 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第五周课后作业