写点什么

week5 home work

用户头像
东哥
关注
发布于: 2020 年 07 月 08 日



编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。



public class VirtualNode {
private LinkedList<String> list = new LinkedList<>();
//有序
// TreeMap<Integer, String> datas = new TreeMap<>();
public void add(String value) {
list.add(value);
}
public void remove(String key) {
list.remove(key);
}
public LinkedList<String> lost(int size) {
LinkedList linkedList = new LinkedList();
if (size == list.size()) {
linkedList.addAll(list);
list = new LinkedList<>();
return linkedList;
}
for (int i = 0 ; i < size; i++) {
linkedList.addLast(list.poll());
}
return linkedList;
}
public void add(LinkedList linkedList) {
this.list.addAll(linkedList);
}
public int size() {
return list.size();
}
}
//slot环
public class HashSlot {
private int nums = 200;
//数组 -- node -- 数据
List<VirtualNode> virtualNodeList = new ArrayList<>();
public HashSlot(int splitNums) {
//环均分
this.nums = splitNums;
for (int i = 0; i<nums; i++) {
virtualNodeList.add(new VirtualNode());
}
}
//添加数据
public void addData(String key) {
//计算hash
VirtualNode node = getVirtualNode(key);
//数据放进去
node.add(key);
}
//添加数据
public void removeData(String key) {
VirtualNode node = getVirtualNode(key);
//数据放进去
node.remove(key);
}
private VirtualNode getVirtualNode(String key) {
//计算hash
int hash = key.hashCode();
//定位
int index = hash % nums;
index = index<0?(10 + index):index;
//找到对应node
return virtualNodeList.get(index);
}
public void addNode(VirtualNode node,int pos) {
VirtualNode existNode = virtualNodeList.get(pos);
virtualNodeList.add(pos + 1, node);
node.add(existNode.lost(existNode.size()/2));
}
public void removeNode(int pos) {
VirtualNode receiveNode = virtualNodeList.get(pos + 1);
VirtualNode lostNode = virtualNodeList.get(pos);
receiveNode.add(lostNode.lost(lostNode.size()));
virtualNodeList.remove(lostNode);
}
}
public class Test {
public static void main(String[] args) {
HashSlot solt = new HashSlot(10);
insertData(solt);
//是个节点的分布情况
int index = 0;
for (VirtualNode virtualNode : solt.virtualNodeList) {
System.out.println(index ++ +" -- " + virtualNode.size());
}
System.out.println("----");
solt.addNode(new VirtualNode(), 5);
index = 0;
for (VirtualNode virtualNode : solt.virtualNodeList) {
System.out.println(index ++ +" -- " + virtualNode.size());
}
System.out.println("----");
solt.addNode(new VirtualNode(), 2);
index = 0;
for (VirtualNode virtualNode : solt.virtualNodeList) {
System.out.println(index ++ +" -- " + virtualNode.size());
}
System.out.println("----");
solt.removeNode(4);
index = 0;
for (VirtualNode virtualNode : solt.virtualNodeList) {
System.out.println(index ++ +" -- " + virtualNode.size());
}
System.out.println("----");
solt.removeNode(4);
index = 0;
for (VirtualNode virtualNode : solt.virtualNodeList) {
System.out.println(index ++ +" -- " + virtualNode.size());
}
}
}



因为不带虚拟节点,增加或者删除节点都是相邻节点承担结果。所以均衡性不好。

带虚拟节点的没有实现,从原理上看肯定是更均匀的。工作较忙,暂时不实现带有虚拟节点的了。

用户头像

东哥

关注

还未添加个人签名 2018.03.25 加入

还未添加个人简介

评论

发布
暂无评论
week5 home work