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()); } }}
因为不带虚拟节点,增加或者删除节点都是相邻节点承担结果。所以均衡性不好。
带虚拟节点的没有实现,从原理上看肯定是更均匀的。工作较忙,暂时不实现带有虚拟节点的了。
划线
评论
复制
发布于: 2020 年 07 月 08 日阅读数: 45
东哥
关注
还未添加个人签名 2018.03.25 加入
还未添加个人简介
评论