【架构师训练营 - week5 -1】作业
发布于: 2020 年 07 月 08 日

一致性hash算法
编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。
import org.apache.commons.lang3.RandomStringUtils;import org.junit.Test;import java.util.ArrayList;import java.util.List;public class ConsistentHashTest {    @Test    public void test() {        List<String> list = new ArrayList<>();        for (int i = 0; i < 1000000; i++) {            String key = RandomStringUtils.randomAlphanumeric(10);            list.add(key);        }        ConsistentHash consistentHash = new ConsistentHash();        consistentHash.consistent(list);    }}
import com.google.common.hash.Hashing;import java.nio.charset.Charset;import java.util.*;public class ConsistentHash {    static List<String> servers = new ArrayList<>();    static Map<Integer, Integer> map = new TreeMap<>();    public void consistent(List<String> keys) {        init();        for (String server : servers) {            for (int i = 0; i < 100; i++) {                String vm = server + "#" + i;                map.put(Hashing.murmur3_32().hashString(vm, Charset.forName("utf-8")).asInt(), 0);            }        }        for (String key : keys) {            for (Integer i : map.keySet()) {                if (Hashing.murmur3_32().hashString(key, Charset.forName("utf-8")).asInt() < i) {                    map.put(i, map.getOrDefault(i, 0) + 1);                }            }        }        int[] data = new int[map.keySet().size()];        int i = 0;        for (int key : map.keySet()) {            data[i++] = map.get(key);        }        System.out.println(standardDeviation(data));    }    public void init() {        for (int i = 0; i < 10; i++) {            servers.add("192.168.0." + i);        }    }    public static double standardDeviation(int[] x) {        int m = x.length;        double sum = 0;        for (int i = 0; i < m; i++) {            sum += x[i];        }        double dAve = sum / m;        double dVar = 0;        for (int i = 0; i < m; i++) {            dVar += (x[i] - dAve) * (x[i] - dAve);        }        return Math.sqrt(dVar / m);    }    public static void main(String[] args) {        Map<Integer, Integer> map1 = new TreeMap<>();        map1.put(5,2);        map1.put(3,2);        map1.put(1,2);        map1.put(2,2);        for (Integer i : map1.keySet()){            System.out.println(i);        }    }}
 划线
   评论
  复制
发布于: 2020 年 07 月 08 日 阅读数: 29
 
 早睡早起
  关注 
还未添加个人签名 2019.09.05 加入
还未添加个人简介
 
 
  
  
 
 
 
  
  
  
  
  
  
  
  
    
评论