leveldb的学习——LSM TREE的学习

最近打算研究研究开源的代码,看上去leveldb比较小巧且好阅读,也打算研究研究存储引擎的原理,万一以后上班改造数据库去了呢哈哈哈

安装

有两种方式,源码编译或者下载压缩包
源码链接

wget https://github.com/google/leveldb/archive/v1.20.tar.gz
tar -zxvf v1.20.tar.gz # z是解压gz结尾的压缩,x是解压,v是可视化,f是后面根文件的名字

cd leveldb-1.20
make -j6 # 表示开几个核心编译,cat /proc/cpuinfo| grep "processor"| wc -l这条命令查看核心数

cp -r include/leveldb /usr/include/

cp out-shared/libleveldb.so.1.20 /usr/lib/

ln -s /usr/lib/libleveldb.so.1.20 /usr/lib/libleveldb.so.1

ln -s /usr/lib/libleveldb.so.1.20 /usr/lib/libleveldb.so # 感觉这条软链接不需要做

ldconfig
# 操作系统文件的时候,看看是不是root权限,不是的话需要sudo + 命令

参考此篇文章

跑一下

#include <iostream>
#include <cassert>
#include <cstdlib>
#include <string>
#include <leveldb/db.h>
using namespace std;
int main(void)
{
    
    
    leveldb::DB *db = nullptr;
    leveldb::Options options;
    options.create_if_missing = true;
    leveldb::Status status = leveldb::DB::Open(options, "./testdb", &db);
    assert(status.ok());
    std::string key = "A";
    std::string value = "a";
    std::string get_value;
    leveldb::Status s = db->Put(leveldb::WriteOptions(), key, value);
    if (s.ok())
        s = db->Get(leveldb::ReadOptions(), "A", &get_value);

    if (s.ok())
        cout << get_value << endl;
    else
        cout << s.ToString() << endl;

    delete db;
    return 0;
}

g++ test.cc -o test -lpthread -lleveldb
./test

可以看到输出的是a

LSM树的学习

这个树好玩啊,和B+树类似,只不过B+树可以原地修改,而LSM树不是就地修改的,而是采用追加的形式变成顺序写。LSM写是有极致体验的,而读就会略微菜鸡一点。这样随机写就变成了顺序写,提高了性能,我对随机和顺序目前的理解就是按顺序写入就是顺序写,比如这个在文件尾后插入数据。WAL(Write Ahead Logging)技术来保证宕机数据恢复,布隆过滤器来加速读取数据。

引用的资料
文章1
文章2
文章3
视屏1

说实话,看完视频看得有点蒙,参考这两篇文章又觉得有些地方可以按照自己的理解写一写

头上是这个结构MemTable,里面有跳表,来保证了key的顺序。考虑这个不能无限制増长而造成的文件过大,有一个限制,超过了这个限制就会变成Immutable MemTable(不可变的内存表)。然后再转换成SSTable格式,准备写入到硬盘中去,具体怎么做的等我再深入理解理解的。还有合并一些操作,可以看看文章3,早看到文章3的话就不自己写了,写的是真的好。

明天学一下bigtable。

猜你喜欢

转载自blog.csdn.net/dxgzg/article/details/120932180