架构师第 2 期第 5 周作业一
发布于: 2020 年 11 月 21 日
用你熟悉的编程语言实现一致性 hash 算法。
编写测试用例测试这个算法,测试 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;
}
}
复制代码
运行结果:
划线
评论
复制
发布于: 2020 年 11 月 21 日阅读数: 68
老坛酸菜
关注
还未添加个人签名 2018.06.16 加入
还未添加个人简介
评论