# LSM Tree 键值存储系统设计文档
## 1. 项目概况
本项目将基于LSM Tree开发一个简化的键值存储系统。支持以下基本操作:
- PUT(K,V)设置键K的值为V
- GET(K)读取键K的值
- DELETE(K)删除键K的值
其中K是64位有符号整数,V位字符串
## 2. 基本结构
![](pic/1.PNG)
LSM Tree的键值存储系统分为内存存储和硬盘存储两部分。
内存部分由跳表实现,控制跳表结构的大小为最大2M当跳表中存储的数据量超过2M时,将会写入文件,并清空跳表。
硬盘部分采用分层存储,每层包含多行文件:第0层最多2个文件,第1层最多4个文件,第2二层最多8个文件……
每个文件分数据区和索引区,索引区同时也存入内存。
## 3. 内存结构——跳表
跳表结构内部由沿横向分层、沿纵向相互耦合的多个列表组成。每层的水平列表由四联表实现,同层节点按关键码排序,
每层列表都设有头、尾哨兵。
层次不同的节点沿纵向组成成塔,同塔内的节点以高度为序也定义了前驱和后继。塔由概率形成,是为了方便查找
![](pic/2.jpg)
本项目的跳表功能由以下几个文件实现:
```
#include "Mynode.h"
#include "Quadlist.h"
#include "Skiplist.h"
```
Mynode.h实现了键值对存储结构和跳表中的四联表节点。四联表节点具有前驱、后继、上驱、下继。
Quadlist.h实现了每层的列表,由Mynode.h中定义的节点形成。
Skiplist.h继承了list类,每个元素由四联表组成,存储跳表的各个层。
以下阐述本项目跳表设计的特殊几点。
### Quadlistnode
四联表的节点除了记录存入的键值对和前驱、后继、上驱、下继外,还记录了del(是否被删除)。如果执行delete(K)
,若在跳表中查询到键为K的键值对的存在,不能简单的直接删除,因为这样不能删除文件系统中已有的键为K的记录,
应在跳表中插入键为K,值为空,并标记为删除的节点。
```
struct Quadlistnode{
Entry entry;
bool del;
QuadlistnodeP pred;
QuadlistnodeP succ;
QuadlistnodeP above;
QuadlistnodeP below;
};
```
### cap()
cap()函数计算跳表的内存占用量,当跳表的大小超过2M时就要写进文件,清空跳表。
## 4. 文件系统——sstable
![](pic/3.jpg)
一个文件分为前面的数据区,后面的索引区,规定INDEX_BEGIN(2M)为索引区开始位置。数据区存放K-V对。索引区
开头存放end(为unsigned int 类型),记录数据区数据结束的位置。紧接着存放索引,存放内容包括:key(键),offset
(该键值对在文件中存放位置距离ios::beg的偏移量),timer(该键值对的时间戳),del(是否被删除)。索引区也在内存
中存放。
```
class LSM_tree {
vector<Level*> disk; //记录各个层的所有文件的索引区信息
unsigned int timer; //标记现在时间timer
Skiplist memtable; //跳表
}
class Level {
public:
int level_id; //标记这是第几层
bool *is_creat; //标记各个文件是否已创造
vector<Sstable*> file; //标记各个文件的素引区信息
}
```
### PUT
1. 用户输入插入命令put(k,v)
2. 检查跳表的内存占用大小,若插入该键值对大小超过2M,则先将该跳表写入文件,并清空跳表后再插入。写入
文件生成索引区时,该跳表的所有键值对的时间戳都记录为此时LSM Tree记录的时间
3. 在memtable(跳表)结构中查询,有没有键为k的键值对,若有直接覆盖,若无则插入。
4. 检查第0层的文件数量是否超出限额,若超出则递归合并。
```
void LSM_tree::put(uint64_t key, const std::string &s, bool d)
bool Level::flush_to_file(Skiplist &memtable, unsigned int timer)
void LSM_tree::compaction()
```
### DELETE
1. 用户输入命令delete(k)
2. 执行put(k,""",true) 第3个参数true表示标记为删除
```
bool LSM_tree::del(uint64_t key) {
if (!find(key)) return false;
std::string s;
put(key, s, true);
return true;
}
```
### GET
1. 用户输入get(k)
2. 先检查跳表中有无k,并检查是否标记为删除。若存在k,并标记为删除,返回空值;若存在k,标记为未删除,则
返回value
3. 若跳表中没有找到k,则要去文件系统的索引区查找,找到时间戳timer最大的值,去文件里获得它的值。
```
std::string LSM_tree::get(uint64_t key)
```
### COMPACTION
1. 若检查第0层的文件数量超出限额,则执行合并
2. 先将第0层的文件全都读进内存,并进行归并,相同key的按时间戳为大取。将合并后的vector temp传递给第1层
3. 第一层寻找key与temp有重叠的文件,全都读进内存进行归并
4. 在该层寻找空文件将归并完的数组进行写入,并生成索引区,同时也将索引区写入。若第一层写满后,temp仍有值
则传给下一层继续进行递归合并,否则停止递归
```
void LSM_tree::compaction()
void LSM_tree::compaction_level_0()
void LSM_tree::compaction_level(int level, vector<sortNode *> *temp)
vector<sortNode *> *LSM_tree::sort_merge(vector<vector<sortNode *> *> &need_to_cpct)
```
## 5. 性能测试
### 测试环境
- 机型:小米笔记本电脑 PRO
- 处理理器器:Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz 2.00GHz
- 内存: 8.00 GB (7.89 GB可用)
- 硬盘: 256G PCIe SSD
- 操作系统: 64位 windows10
### 1.正确性测试
通过
### 2. 性能测试
#### 时延
在正常情况下(无compaction),PUT,GET,DELETE操作所需要的平均时间。
##### ①测试参数与方法
1. 考虑put操作相较delete函数更容易发生compaction和flush_to_file。三种操作分别进行TEST_NUM=3072次(该次数情况下put操
作会发生flush_to_file,而delete不会),记录TEST_NUM次测试里面,不发生compaction的操作的总时间和次数,最后求出平均值。在LSM_Tree类中
添加公有数据成员compact记录有无发生合并。而对于delete操作和get操作,原树中已有数据量的大小是会对操作耗时产生影响的,已有
。此处控制原数据量均为10240个,put操作从原数据为0个的时候开始。原数据量对delete和get的影响在3中进行
讨论和分析。
2. 排除flush_to_file的影响控制操作次数为400到2000,这写操作次数范围内,PUT和DELETE都不会发生flush_to_file。控制delete
和get的原数据量为10240个。
3. 控制原数据(在delete或get操作前,数据结构中已有数据量),探究2024次delete和get操作的平均耗时。
使用#include <time.h>库中的clock()函数记录操作所需时间。
##### ②测试结果与分析
1. 三种操作分别进行TEST_NUM=3072次
![](pic/6.PNG)
有测试结果图可以看出,在正常情况(不考虑compaction)下DELETE操作平均用时最少,PUT操作次之,GET操作最为耗时。GET操作耗时
最多是因为,每次get操作,如果查询成功(key存在),则必然引发一次文件读写,文件读写较为耗时。而put,delete操作,可能不会引发文件
读写。
但是考虑到PUT操作会涉及到flush_to_file,也就是当跳表中达到存储限额时,要将跳表写入文件,又单独测试了PUT操作
在不考虑compaction时,不同操作次数的平均耗时。
![](pic/4.PNG)
由该图可以看出,PUT操作的平均耗时并不是随操作次数的增多平稳上升的,在图中有两个峰值,分别是操作次数为2100,
2900时出现的。据分析,这几次峰值出现的原因是,跳表中数据存储达到阈值,需要进行flush_to_file,将跳表的数据写入文件,涉及
到文件读写,增加了PUT操作的耗时。
影响put和delete相对用时的因素,据分
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:设计报告word+源码及数据及可执行exe文件 本项目将基于LSM Tree开发一个简化的键值存储系统。支持以下基本操作: PUT(K,V)设置键K的值为V GET(K)读取键K的值 DELETE(K)删除键K的值 其中K是64位有符号整数,V位字符串 LSM Tree的键值存储系统分为内存存储和硬盘存储两部分。 内存部分由跳表实现,控制跳表结构的大小为最大2M当跳表中存储的数据量超过2M时,将会写入文件,并清空跳表。 硬盘部分采用分层存储,每层包含多行文件:第0层最多2个文件,第1层最多4个文件,第2二层最多8个文件…… 每个文件分数据区和索引区,索引区同时也存入内存。 详细介绍参考:https://blog.csdn.net/newlw/article/details/122944456
资源推荐
资源详情
资源评论
收起资源包目录
基于LSM-Tree的键值存储引擎的设计与实现.zip (88个子文件)
lsm_tree
设计报告.docx 670KB
cmake-build-debug
CMakeCache.txt 48KB
pro1_1.cbp 6KB
cmake_install.cmake 1KB
project1-kvstore.exe 5.29MB
project1-kvstore.cbp 8KB
Makefile 9KB
CMakeFiles
cmake.check_cache 85B
progress.marks 2B
Makefile2 4KB
3.15.3
CMakeDetermineCompilerABI_C.bin 279KB
CMakeSystem.cmake 380B
CompilerIdCXX
a.exe 279KB
CMakeCXXCompilerId.cpp 19KB
CMakeCCompiler.cmake 3KB
CMakeCXXCompiler.cmake 5KB
CMakeRCCompiler.cmake 228B
CompilerIdC
a.exe 279KB
CMakeCCompilerId.c 20KB
CMakeDetermineCompilerABI_CXX.bin 279KB
clion-log.txt 344B
pro1_1.dir
objects1.rsp 35B
progress.make 43B
depend.make 90B
cmake_clean.cmake 288B
flags.make 205B
build.make 4KB
linklibs.rsp 98B
link.txt 474B
DependInfo.cmake 619B
Makefile.cmake 5KB
TargetDirectories.txt 276B
CMakeOutput.log 52KB
clion-environment.txt 53B
project1-kvstore.dir
objects1.rsp 291B
Level.cpp.obj 536KB
progress.make 148B
kvstore.cc.obj 370KB
LSM_tree.cpp.obj 979KB
depend.make 2KB
objects.a 2.59MB
Quadlist.cpp.obj 137KB
cmake_clean.cmake 614B
Skiplist.cpp.obj 262KB
includes_CXX.rsp 50B
CXX.includecache 2KB
flags.make 254B
build.make 12KB
linklibs.rsp 98B
correctness.cc.obj 324KB
link.txt 544B
DependInfo.cmake 1KB
depend.internal 2KB
CMakeDirectoryInformation.cmake 683B
kvstore_api.h 962B
Skiplist.h 916B
correctness.cc 2KB
LSM_tree.cpp 22KB
pic
6.PNG 11KB
7.PNG 28KB
5.PNG 11KB
2.jpg 194KB
1.PNG 13KB
4.PNG 40KB
3.jpg 152KB
8.PNG 9KB
11.PNG 161KB
9.PNG 36KB
10.PNG 23KB
12.PNG 213KB
data
.gitkeep 0B
kvstore.h 444B
Level.cpp 4KB
persistence.cc 4KB
Mynode.h 1KB
LICENSE 1KB
Level.h 2KB
test.h 2KB
kvstore.cc 996B
main.cpp 97B
performance.cpp 5KB
CMakeLists.txt 369B
Makefile 199B
Quadlist.h 777B
LSM_tree.h 1KB
README.md 12KB
Skiplist.cpp 5KB
Quadlist.cpp 830B
共 88 条
- 1
资源评论
- 睡觉8942023-03-25资源很好用,有较大的参考价值,资源不错,支持一下。
- qq_271731092022-07-18资源质量不错,和资源描述一致,内容详细,对我很有用。
- m0_676601632023-05-19简直是宝藏资源,实用价值很高,支持!
- kkkkezh2022-07-21资源很赞,希望多一些这类资源。
shejizuopin
- 粉丝: 9515
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功