悠悠楠杉
网站页面
正文:
在软件开发中,键值数据库(Key-Value Store)因其高效和灵活性被广泛应用,比如Redis和LevelDB。今天,我们将用C++从零实现一个简易的键值数据库,核心功能包括数据的存储、查询和删除。
键值数据库的核心是快速通过键(Key)检索值(Value)。我们选择哈希表作为底层数据结构,因为它的平均时间复杂度为O(1)。以下是实现步骤:
- 使用std::unordered_map存储键值对。
- 封装增删查接口,支持持久化存储(将数据保存到文件)。
首先定义数据库类KeyValueDB,包含基本操作:
#include <unordered_map>
#include <string>
#include <fstream>
class KeyValueDB {
private:
std::unordered_map<std::string, std::string> data;
std::string filename;
public:
KeyValueDB(const std::string& file) : filename(file) {
loadFromFile(); // 启动时加载持久化数据
}
void set(const std::string& key, const std::string& value) {
data[key] = value;
saveToFile(); // 每次修改后保存
}
std::string get(const std::string& key) {
return data.count(key) ? data[key] : "[Not Found]";
}
void remove(const std::string& key) {
data.erase(key);
saveToFile();
}
private:
void saveToFile() {
std::ofstream file(filename);
for (const auto& pair : data) {
file << pair.first << "|||" << pair.second << "\n";
}
}
void loadFromFile() {
std::ifstream file(filename);
std::string line, key, value;
while (std::getline(file, line)) {
size_t pos = line.find("|||");
if (pos != std::string::npos) {
key = line.substr(0, pos);
value = line.substr(pos + 3);
data[key] = value;
}
}
}
};创建一个实例并测试基本操作:
int main() {
KeyValueDB db("mydb.dat");
db.set("name", "John");
db.set("age", "30");
std::cout << "Name: " << db.get("name") << std::endl; // 输出 John
db.remove("age");
std::cout << "Age: " << db.get("age") << std::endl; // 输出 [Not Found]
return 0;
}std::mutex保护data的读写。通过这个简易实现,你不仅理解了键值数据库的核心原理,还能根据需求进一步扩展。动手试试吧!