C++ 一致性缓存的测试
程序员文章站
2022-06-02 11:47:17
...
关于一致性hash网上的例子很多, 原理在网上也能找得到,随便实现了一个,没有虚拟节点的。为了图方便也只是用的list和sort,如果真的要写的很好的话就要自己写一个环状的数据结构
#include <iostream>
#include <functional> //hash
#include <vector>
#include <map>
#include <algorithm>
#include <string>
#include <cstdio>
typedef unsigned long long ull;
using namespace std;
bool cmp(const pair<string, unsigned long long> &a, const pair<string, unsigned long long> &b)
{
return a.second < b.second;
}
class hash_consistent
{
std::hash<string> getHash;
ull h(const string &host)
{
return (ull)(getHash(host)) % (((ull)INT32_MAX) + 1);
}
public:
map<string, map<string, string>> hostList; //使用map有序排列各个host
vector<pair<string, unsigned long long>> circle; //用vector保存哈希环,用于决定缓存的存放位置
void addServer(const string &host)
{
if (hostList.count(host) != 0)
return; //主机已经上线,则返回
circle.push_back(
make_pair(
host,
h(host)));
sort(circle.begin(), circle.end(), cmp); //按照hash排序
hostList[host].emplace();
}
bool set(const string &key, const string &val)
{
//在这里统一计算hash并且插入
ull hash = h(key);
for (int i = 1; i < circle.size(); i++)
{
if (hash > circle[i].second)
{
continue;
}
else
{
printf("%s:%s \t\t的hash为:%ull,被保存在hash为:%ull的服务器上\n", key.c_str(),val.c_str(), hash, circle[i - 1].second);
hostList[circle[i - 1].first][key] = val;
return true;
}
} //从1找,都没有找到,则说明将会插在第0个节点,因为是个环
printf("%s:%s \t\t的hash为:%ull,被保存在hash为:%ull的服务器上\n", key.c_str(),val.c_str(), hash, circle[0].second);
hostList[circle[0].first][key] = val;
return true;
}
string get(const string& key){
ull hash=h(key);//计算hash
for (int i = 1; i < circle.size(); i++)
{
if (hash > circle[i].second)
{
continue;
}
else
{
if(hostList[circle[i-1].first].count(key)==0)return "找不到";
return hostList[circle[i - 1].first][key];
}
}
if(hostList[circle[0].first].count(key)==0)return "找不到";
return hostList[circle[0].first][key];
}
};
int main()
{
hash_consistent hc;
hc.addServer("127.12.22.5:4555");
hc.addServer("127.12.2.2:4555");
hc.addServer("127.4.12.3:4555");
hc.addServer("192.0.1.4:4555");
hc.set("key1", "123456");
hc.set("key2", "6666");
hc.set("key3", "zxcvbnm");
hc.set("key4", "哈哈哈哈");
hc.set("key5", "123123456");
hc.set("百度", "www.baidu.com");
hc.set("谷歌", "www.google.com");
hc.set("雅虎", "www.yahoo.com");
cout<<"-----------------------"<<endl;
string key;
while(true){
cin>>key;
if(key=="q"){
break;
}
cout<<hc.get(key)<<endl;
}
return 0;
}
上一篇: 协议的一致性
下一篇: zookeeper的一致性
推荐阅读
-
MySQL5.7使用pt-table-checksum检查主从数据一致性的测试讲解
-
应用中引入缓存层后,缓存和持久化层数据一致性的思考
-
PHP经典面试题:如何保证缓存与数据库的双写一致性?
-
C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试
-
C++较精确的测试代码运行时间
-
高并发高可用复杂系统中的缓存架构(十五) 缓存架构讲解,如何保证缓存数据库一致性
-
PHP 文件缓存的性能测试
-
无人驾驶仿真(十一):编写基于ROS的C++测试代码,控制车辆运动
-
C++类的完美单元测试方案——基于C++11扩展的friend语法
-
CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试