写点什么

架构师第 2 期第 5 周作业一

用户头像
老坛酸菜
关注
发布于: 2020 年 11 月 21 日
  1. 用你熟悉的编程语言实现一致性 hash 算法。

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


C#实现

class Program
{
    /// <summary>
    /// 10个服务器节点
    /// </summary>
    private static String[] Servers = { "192.168.1.10", "192.168.1.11", "192.168.1.12", "192.168.1.13", "192.168.1.14", "192.168.1.15", "192.168.1.16", "192.168.1.17", "192.168.1.18", "192.168.1.19" };
    
    /// <summary>
    /// HashCode与服务器映射字典
    /// </summary>
    private static SortedDictionary<int, string> SortedDict = new SortedDictionary<int, string>();
    /// <summary>
    /// 各服务器分布的KV数据计数器
    /// </summary>
    private static Dictionary<int, int> Counter = new Dictionary<int, int>();
    /// <summary>
    /// 最大Key数量
    /// </summary>
    private const int MaxKeyCount = 1000000;
    static void Main(string[] args)
    {
        InitHashDictionary();
        Dictionary<string, string> dict = CreateKeyValues();
        foreach(KeyValuePair<string, string> kv in dict)
        {
            KeyValuePair<int, string> server =GetServer(kv.Key);
            Counter[server.Key]++;
        }
        for(int i=0;i<Counter.Count;i++)
        {
            KeyValuePair<int, int> kv = Counter.ElementAt(i);
            Console.WriteLine($"服务器{i}分布KV数量{kv.Value}个,占比{Math.Round((double)kv.Value/MaxKeyCount*100,2)}%.");
        }
        Console.ReadLine();
    }
    /// <summary>
    /// 初始化服务器HashCode
    /// </summary>
    private static void InitHashDictionary()
    {
        int hashCode = 0;
        foreach(string server in Servers)
        {
            hashCode =Math.Abs(server.GetHashCode());
            SortedDict.Add(hashCode, server);
            Counter.Add(hashCode, 0);//初始化,用于统计各服务器键值分布情况
        }
    }
    /// <summary>
    /// 根据缓存Key找到对应的服务器
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    private static KeyValuePair<int,string> GetServer(string key)
    {
        int hashKey = key.GetHashCode();
        foreach(var kv in SortedDict)
        {
            if(kv.Key>hashKey)
            {
                return kv;
            }
        }
        return SortedDict.ElementAt(0);
    }
    /// <summary>
    /// 创建100万KV数据
    /// </summary>
    /// <returns></returns>
    private static Dictionary<string, string> CreateKeyValues()
    {
        Dictionary<string, string> dict = new Dictionary<string, string>();
        string key = string.Empty;
        for (int i = 0; i < MaxKeyCount; i++)
        {
            key = i.ToString();
            dict.Add(key,key);
        }
        return dict;
    }
}
复制代码


  • 运行结果:


用户头像

老坛酸菜

关注

还未添加个人签名 2018.06.16 加入

还未添加个人简介

评论

发布
暂无评论
架构师第2期第5周作业一