VirgilZhu 06fa3f20b3 | 1 month ago | ||
---|---|---|---|
.github/workflows | 删除 | 1 year ago | |
benchmarks | 删除 | 1 year ago | |
cmake | 删除 | 5 years ago | |
db | 删除 | 4 months ago | |
doc | 删除 | 2 years ago | |
helpers/memenv | 删除 | 3 years ago | |
image | 删除 | 1 month ago | |
include/leveldb | 删除 | 2 months ago | |
issues | 删除 | 3 years ago | |
port | 删除 | 1 year ago | |
table | 删除 | 1 year ago | |
test | 删除 | 1 month ago | |
third_party | 删除 | 1 year ago | |
util | 删除 | 1 year ago | |
.clang-format | 5 years ago | ||
.gitignore | 2 months ago | ||
.gitmodules | 4 years ago | ||
AUTHORS | 11 years ago | ||
CMakeLists.txt | 2 months ago | ||
CONTRIBUTING.md | 3 years ago | ||
LICENSE | 13 years ago | ||
NEWS | 13 years ago | ||
README.md | 1 month ago | ||
TODO | 12 years ago |
**项目背景:**LevelDB 项目的 KV 键值对存储信息单一;LSM-Tree 读写放大开销大,导致 LevelDB 顺序范围查询时的数据吞吐量随 Value 大小增加而急剧下降。
Field
: field_name: field_value
;Fields
来操作字段数组,与字段相关的字段截取、读写操作、序列化等函数均在 Fields
类中实现;FindKeysByField
,传入若干字段名和字段值(即子字段数组),遍历查找 LSM-Tree 找到对应的若干 key。<key, <fileno, offset>>
的形式;小 value 则与原 LevelDB SSTable 中 KV 键值对存储格式相同;offset
和 vLog 的编号 fileno
,将 <key, <fileno, offset>>
写入 WAL 和 Memtable 中;<fileno, offset>
到 LSM-Tree 中;Field
& FieldArray
:
using Field = std::pair<std::string, std::string>;
using FieldArray = std::vector<std::pair<std::string, std::string>>;
class Fields
,用于操作字段数组。class Fields
class Fields {
public:
// 从 FieldArray 构造
explicit Fields(FieldArray field_array);
// 从字符串解码构造
explicit Fields(const std::string& value_str);
~Fields();
// 更新字段值
void update_field(const std::string& name, const std::string& value);
// 获取字段
Field get_field(const std::string& name) const;
// 检查字段是否存在
bool has_field(const std::string& name) const;
// 序列化字段数组为字符串
std::string Serialize() const;
// 重载运算符 [] 用于访问字段值
std::string operator[](const std::string& name) const;
// 重载运算符 [] 用于修改字段值
std::string& operator[](const std::string& name);
// 重载运算符 == 用于比较两个 Fields 是否相等
bool operator==(const Fields& other) const;
};
大 value 的 key 对应的 value 存储位置:VPtr
struct VPtr {
int fileno; // VLog 文件号
uint64_t offset; // 偏移量
};
class VLog
class VLog {
private:
// 该 VLog 是否活跃,即可插值
bool activate_;
// 最大 VLog 大小
std::size_t maxSize_;
// GC 计数器
std::size_t deadkeyCount;
public:
// 构造函数,默认赋值 GC 计数器为 GC 触发的最大阈值
VLog(bool activate, std::size_t maxSize, std::size_t gcThreshold)
: activate_(activate), maxSize_(maxSize), deadkeyCount(gcThreshold) {}
// 向 VLog 中添加一个新的键值对
virtual void append(const std::string& key, const std::string& value) = 0;
// 查找给定键对应的值
virtual VPtr lookup(const std::string& key) const = 0;
// 执行垃圾回收操作
virtual void GarbageCollection() = 0;
virtual ~VLog() {}
};
FieldArray
、反序列化解析 value ;)VPtr
找到 VLog 中正确的 value;VPtr
。功能 | 预计完成日期 | 分工 |
---|---|---|
Fields 类和相关接口实现 | 12月3日 | 朱维清、谷杰 |
测试实现字段功能 | 12月5日 | 谷杰 |
VLog 类和相关接口实现 | 12月15日 | 朱维清、谷杰 |
测试实现 KV 分离 | 12月19日 | 朱维清 |
Benchmark 测试(吞吐量、写放大、点查范围查) | 12月26日 | 谷杰 |
Benchmark 测试(GC 开销、大小数据集、并发) | 12月26日 | 朱维清 |