分析代码:https://github.com/aronszanto/sLSM-Tree
文章目录
LSM
LSM参数
参数名 | demo给的默认值 | 参数含义 |
---|---|---|
eltsPerRun | 800 | 每个run(skiplist)最大的KV数目 |
numRuns | 20 | 内存层最多能持有多少 跳表 |
merged_frac | 1.0 | 每次merge的时候merge多少占比的缓冲区runs,如果是1全部merge。 代码中用于计算 _frac_runs_merged |
bf_fp | 0.001 | BF的false positive |
pageSize | 1024 | 栅格指针数目 |
diskRunsPerLevel | 20 | disk的runs有多少层 |
LSM — insert_key
void insert_key(K &key, V &value) {
if (C_0[_activeRun]->num_elements() >= _eltsPerRun) {
++_activeRun;
}
if (_activeRun >= _num_runs) {
do_merge();
}
C_0[_activeRun]->insert_key(key, value);
filters[_activeRun]->add(&key, sizeof(K));
}
如果当前_activeRun指向的跳表满了,_activeRun++,指向下一个跳表
如果跳表都满了,执行do_merge。do_merge会把跳表落盘、清空跳表vector C_0和布隆过滤器vector filters
插入元素:C_0 和 filters
注意:插入也包含了修改的功能,详解这个文章:知乎 - 深入浅出分析LSM树(日志结构合并树)
LSM — delete_key
极其简单,插入墓碑标记 tombstone
原理可以看这个文章:知乎 - 深入浅出分析LSM树(日志结构合并树)
void delete_key