初识:LevelDB
初识:LevelDB
上篇文章缘起:BigTable可以说是已经把论文Bigtable: A Distributed Storage System for Structured Data
中的内容掰扯的明明白白,如果哪位小伙伴感觉还有不理解的点,可以点连接进去再反复琢磨几遍,说不定就顿悟了呢~
之所以先花时间把BigTable掰扯了一篇,就是为了引出今天的主人公,LevelDB,接下来呢,我会一点点分享自己阅读LevelDB源码遇到的问题和学习到的一些技术,希望大家多多关注,如有问题,也请大家多多留言,一起学习,一起Happy~
LevelDB是个啥?
LevelDB是对BigTable中KV存储分片Tablet的高度复刻,是由Jeff Dean和Sanjay 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。
- 启动应用程序,同时指定可能影响程序的参数
- 在指定条件下停止程序(断点)
- 检查程序停止时到底发生了计算(获取程序执行到断点时的状态信息)
- 修改程序中的内容,使得程序员可以尝试纠正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
缩写为n
,step
缩写为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++大佬多多指正,多多交流。
另外,大家可以关注我的微信公众号,博客会同步更新的哟~
白嫖多不好,关注下再走呗~
初识:LevelDB的更多相关文章
- LevelDB学习笔记 (1):初识LevelDB
LevelDB学习笔记 (1):初识LevelDB 1. 写在前面 1.1 什么是levelDB LevelDB就是一个由Google开源的高效的单机Key/Value存储系统,该存储系统提供了Key ...
- LevelDB,你好~
LevelDB,你好~ 上篇文章初识:LevelDB介绍了啥是LevelDB,LevelDB有啥特性,以及Linux环境下编译,使用及调试方法. 这篇文章的话,算是LevelDB源码学习的开端吧,主要 ...
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
随机推荐
- Mybatis一对多或多对多只能查出一条数据解决策略
原文:https://blog.csdn.net/ren814/article/details/81742242 <resultMap id="menuModelMap" t ...
- ZWave对COMAND CLASS的处理流程
文章主题 在开发一个 ZWave Device 的过程中,对 COMAND CLASS(单词太长了,后面就简写为 CC 啦) 的处理是最基本.最重要的工作.这篇文章以最最简单的 CC:COMMNAD ...
- 记一次 CocoaPod 的使用过程
目前有一个cocos2d creator项目, 接入了微信SDK, 现在需要接入阿里云移动推送. 用到了CocoaPod集成. 于是创建了一个Podfile, (此文件在项目目录中, 和 xxx ...
- 6.kubernetes的GUI资源管理插件-dashboard
目录 1.准备dashboard镜像 2.创建资源配置清单 3.应用资源配置清单 4.查看创建的资源 5.解析域名 6.浏览器访问 7.令牌命令行获取方式 准备dashboard镜像 [root@hd ...
- 使用addEventListener绑定事件是关于this和event记录
DOM元素使用addEventListener绑定事件的时候经常会碰到想把当前作用域传到函数内部,可以使用以下两种放下: var bindAsEventListener=function (objec ...
- Linux操作篇之配置DNS服务(一)
一.什么是DN. 域名(Domain Name)又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置).它的作用只 ...
- 深入理解JVM(③)虚拟机的类加载时机
前言 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制. 类加载的时机 一个类型 ...
- 入门大数据---Hbase 过滤器详解
一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...
- 入门大数据---Hbase协处理器详解
一.简述 Hbase 作为列族数据库最经常被人诟病的特性包括:无法轻易建立"二级索引",难以执 行求和.计数.排序等操作.比如,在旧版本的(<0.92)Hbase 中,统计数 ...
- python文件处理-根据csv文件内容,将对应图像拷贝到指定文件夹
内容涉及:文件遍历,读取csv指定列,拷贝文件,清理和创建文件 # -*- coding: utf-8 -*- import csv import os import sys import numpy ...