hg0088:初识:LevelDB

admin 2周前 (09-15) 科技 38 1

初识:LevelDB

上篇文章缘起:BigTable可以说是已经把论文Bigtable: A Distributed Storage System for Structured Data中的内容掰扯的明明白白,若是哪位小伙伴感受另有不理解的点,可以点毗邻进去再频频琢磨几遍,说不定就顿悟了呢~

之所以先花时间把BigTable掰扯了一篇,就是为了引出今天的主人公,LevelDB,接下来呢,我会一点点分享自己阅读LevelDB源码遇到的问题和学习到的一些手艺,希望人人多多关注,若有问题,也请人人多多留言,一起学习,一起Happy~

LevelDB是个啥?

LevelDB是对BigTable中KV存储分片Tablet的高度复刻,是由Jeff DeanSanjay Ghemawat,这两位大牛也是BigTable论文的作者,只管我们不能对BigTable的底层实现一探事实,不外,开源的LevelDB照样可以让我们对其管中窥豹呢~

简而言之,LevelDB就是一个由Google开源的高效的单机Key/Value存储系统,该存储系统提供了Key到Value的有序映射。

LevelDB有啥特点

  • LevelDB中Key/Value可以是随便长度的字节数组
  • LevelDB中的数据是按Key有序存储的,也就是说,局限查询效率会很高
  • LevelDB支持用户提供自定义Key排序规则
  • 与其他KV存储系统类似,提供Put(key, value)Get(key)Delete(key)这些基本操作
  • LevelDB支持在一个原子批量操作中对统一个Key执行多次修改操作
  • LevelDB通过瞬时快照(Transient Snapshot)为用户提供一致的数据视图
  • LevelDB支持数据的前向/后向迭代遍历
  • LevelDB底层使用Snappy压缩算法自动对数据举行压缩
  • LevelDB将外部流动(例如,文件系统操作)抽象为虚拟接口,为用户自定义这些操作系统交互方式提供了便利,也就是说,用户可以自定义底层到底是与Linux系统交互,照样与Windows系统交互,甚至于HDFS/GFS等分布式文件系统~

LevelDB有哪些限制

  • LevelDB不是SQL数据库,不存在关系数据模子,也不支持SQL查询,同样不支持索引
  • 给定LevelDB数据库,统一时刻,该数据库只能由单历程(可能是多线程)接见
  • LevelDB库自己不是基于C/S(Client/Server)模子的,也就是说,若是你想要像MySQL等种种其他数据库那样,通过客户端毗邻远程服务器的方式接见LevelDB的话,那么,你需要自己将LevelDB包装成服务端,然后再实现响应的客户端才可以

这部门呢,先简朴先容了LevelDB的特征以及使用限制,实在呢,也从侧面给出了LevelDB的使用场景,对照适合单机KV存储。

LevelDB快速上手

ε=(´ο`*)))唉、实在呢,我现在的主语言是Java,并不是C/C++,太久不用C/C++了,若是有啥错误,列位看官多多提点~

Windows下LevelDB从入门到放弃

Windows下编译LevelDB太恶心了,TM有毒,放弃了、我只是想编译调试下而已,种种拦路虎,算了,爱谁谁,至心感受Windows下除了他自家的全家桶外,其余都欠好用,就TM有毒,真是服气了,不搞了,想在Windows下用LevelDB的,自己掂量着办~

Linux下LevelDB快乐地玩耍

LevelDB编译安装

相比于Windows下LevelDB的编译,Linux环境下简直不要太友好,唯一的瑕玷就是,用Idea用习惯了,调试有点不太在行~

[root@cos leveldb-1.22]# mkdir -p build && cd build
# 注重:为了调试时可以进入LevelDB库源码,这里最好编译成Debug版本
# 编译成Debug版本
[root@cos build]# cmake -DCMAKE_BUILD_TYPE=Debug .. && cmake --build .
# 编译成Release版本
[root@cos build]# cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
# 将链接文件拷贝到/usr/local/lib目录下,以便程序挪用
[root@cos build]# cp libleveldb.a /usr/local/lib/
# 将头文件拷贝到/usr/local/include中,以便程序引用
[root@cos leveldb-1.22]# cp -r include/leveldb/ /usr/local/include/

LevelDB测试代码

#include <cassert>
#include <iostream>
#include <string>
#include <leveldb/db.h>

int main() {
    
    leveldb::DB* db; 
    leveldb::Options options;

    // 设置项:若是LevelDB数据库目录不存在,则自动建立
    options.create_if_missing = true;
    
    leveldb::Status status = leveldb::DB::Open(options, "/root/testdb", &db);
    
    assert(status.ok());

    std::string key = "apple";
    std::string value = "Apple";

    // 将key/value键值对写入LevelDB数据库
    leveldb::Status s = db->Put(leveldb::WriteOptions(), key, value);

    std::string get;
    // 写入乐成后,实验凭据key举行检索
    if(s.ok()) {
        s = db->Get(leveldb::ReadOptions(), key, &get);
    }   
    if(s.ok()) {
        std::cout << "读取到Key=" << key << "对应的Value=" << get << "." << std::endl;
    } else {
        std::cout << "读取失败!" << std::endl;
    }   

    delete db; 

    return 0;
}

编译并执行程序,效果如下:

# 对main.cc源文件举行编译
[root@cos leveldb]# g++ -o main main.cc -pthread -lleveldb -std=c++11
# 执行main可执行程序
[root@cos leveldb]# ./main 
读取到Key=apple对应的Value=Apple.

Linux下C/C++代码调试

额(⊙o⊙)…前面说了,我不是做C/C++开发的,Linux是最小化安装的,想调试下代码,难为死我了,妙手直接跳过就好~

GDB基本先容

诸如GDB等代码调试器的无外乎两种功效:

  • 辅助程序员看到程序执行时内部到底是个啥样
  • 辅助程序员知道其程序溃逃时程序正在干啥

基本上每种语言都有代码调试器,而调试器的功效也无非就上面说的这两种功效。

GDB能做的事情,也许可以分为四类,这四类功效可以辅助程序员快速定位Bug。

  1. 启动应用程序,同时指定可能影响程序的参数
  2. 在指定条件下住手程序(断点)
  3. 检查程序住手时到底发生了盘算(获取程序执行到断点时的状态信息)
  4. 修改程序中的内容,使得程序员可以实验纠正Bug的影响,从而继续调试代码

通过Shell下令gdb可以启动GDB,一旦GDB启动乐成,程序员就可以不断地在终端中输入下令来见告GDB下一步要干嘛,若是想要终止的话,则需要输入quit下令。

用户可以执行gdb下令的同时不输入任何参数,然则,大多数场景下,用户会输入1到2个参数,如下所示。

# 将可执行程序作为参数,程序编译时需要添加-g参数
gdb program
# 将可执行程序以及core文件作为参数
gdb program core
# 若是想要调试正在运行的历程,则需要将历程ID作为第二个参数
gdb program 1234
gdb -p 1234

GDB常用下令

这里只是先容一些常用的GDB下令,更多的话,人人去看man gdb文档吧

break [file:]functiop:在指定文件[file]functiop方式入口设置断点

run [arglist]:启动程序,参数列表为arglist

bt:Backtrace: 显示程序栈

print expr:盘算表达式expr的效果

c:继续执行程序,直到遇到下一个断点

next:执行下一行(除非遇到断点);也就是说,该下令无论下一行挪用若干方式,会直接跳过,除非函数内部有断点

edit [file:]function:查看指定文件中的方式的断点信息

list [file:]function:列出当前断点四周的代码

step:执行下一行代码,若是该行代码有方式挪用则进入该方式

help name:展示GDB的name下令的辅助信息。

注重:上面下令中,next缩写为nstep缩写为s,分别是按行调试和单步调试,另有c下令,都是异常常用的~

LevelDB代码调试样例

# 对main.cc源文件举行编译,同时加入调试信息,后续可以使用gdb举行调试
[root@cos leveldb]# g++ -o main main.cc -pthread -lleveldb -std=c++11
# 使用gdb对main举行调试
[root@cos leveldb]# gdb -tui main

注重:为了调试利便,最好使用-tui参数,这样的话,调试时,就可以像Idea那样,边看代码边加断点了~

调试时,也许就是下图的样子~

注重:若是在编译LevelDB时未指定为Debug版本,则无法像图2那样进入到LevelDB源码。

初识:LevelDB小结

实在吧,LevelDB的焦点源码及架构,我已经看的七七八八了,就是,自己我主语言是Java的,然后,我就一直没有勇气去Debug到源码中仔细瞅一瞅,趁着这次梳理的机遇,计划一点点跟进去看看、可能会更新的有点慢,不外,鲜花易谢,希望人人多多关注,同时也迎接列位C/C++大佬多多指正,多多交流。

另外,人人可以关注我的微信民众号,博客会同步更新的哟~
白嫖多欠好,关注下再走呗~

,

欧博电脑版下载

欢迎进入博电脑版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:hg0088:初识:LevelDB

文章归档

站点信息

  • 文章总数:348
  • 页面总数:0
  • 分类总数:8
  • 标签总数:711
  • 评论总数:20
  • 浏览总数:3418