LevelDB从前门到后门之蜻蜓点水篇
因为自己对数据库比较感兴趣,所以听说LevelDB时间比较早,但因种种原因一直没有写过相关的文章。这段时间不忙,准备做一个系列相关的主题。
我们知道,现在主流的数据库有从关系型数据库逐渐往分布式数据库迁移的趋势,比如大名鼎鼎的TiDB和PolarDB。而TiDB底层存储引擎使用的是RocksDB,RocksDB则使用了LevelDB(这就是开源的力量,相互借鉴)。从这方面看,LevelDB的性能可见一斑。
本篇文章主要介绍LevelDB的一些特点和基础概念。LevelDB是LSM (Log Structured Merge)算法的实现。里面涉及大量关于文件系统读写技术的真实案例。我们可以从中收货很多重要信息。
当前官方的源码地址:C++版本,另外还有两个移植版本分别是GoLevelDB和JavaLevelDB。工程从结构和文件命名上基本保持了跟C++版本的一致。各位看官可以根据自己的喜好各取所需。不过建议还是从C++官方版本看起。有位老哥之前做过一版注释,不过可能是基于main主分支为母版,但是并不影响代码阅读。我使用当前版本为1.22。
我自己用的是Mac电脑,主要开发语言是Java。对于C++的使用,更倾向于使用centos系统。所以我平时都是自建虚拟机,然后通过VSCode插件Remote Development"远程"控制来完成项目编译和调试工作。
获取源代码: git clone --recurse-submodules https://github.com/google/leveldb.git
构建: mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
注:编译完是没有 out-shared , out-static 这两个文件夹 。
头文件介绍:
leveldb 对外暴露的接口都在 include/*.h 中,用户不应该依赖任何其它目录下的头文件,这些内部 API 可能会在没有警告的情况下被改变。 include/leveldb/db.h :主要的 DB 接口,从这开始。 include/leveldb/options.h : 控制数据库的行为,也控制当个读和写的行为。 include/leveldb/comparator.h : 比较函数的抽象。如果你只想对 key 逐字节比较,可以直接使用默认的比较器。如果你想要自定义排序(例如处理不同的字符编码、解码等),可以实现自己的比较器。 include/leveldb/iterator.h :迭代数据的接口,你可以从一个 DB 对象获取到一个迭代器。 include/leveldb/write_batch.h :原子地将多个操作应用到数据库。 include/leveldb/slice.h :类似 string,维护着指向字节数组的指针和对应的长度。 include/leveldb/status.h :许多公共接口都会返回 Status ,用于报告成功或各种错误。 include/leveldb/env.h :操作系统环境的抽象,该接口的 posix 实现位于 util/env_posix.cc 中. include/leveldb/table.h, include/leveldb/table_builder.h :底层的模块,大多数用户可能不会直接用到。
我们可以编写一段代码,来进行简单的测试: #include #include #include #include using namespace leveldb; int main() { leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; // 打开一个数据库,不存在就创建 leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db); assert(status.ok()); // 插入一个键值对 status = db->Put(leveldb::WriteOptions(), "hello", "LevelDB"); assert(status.ok()); // 读取键值对 std::string value; status = db->Get(leveldb::ReadOptions(), "hello", &value); assert(status.ok()); std::cout << value << std::endl; delete db; return 0; }
编译命令: g++ test_db.cc -o test_db -L /usr/local/lib64 -lleveldb -lpthread -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++11
指定静态库路径:-L /usr/local/lib64 ,静态库名称:-lleveldb D_GLIBCXX_USE_CXX11_ABI:GCC版本1.5前后接口兼容性问题闭坑参数。
执行test_db文件后,进入/tmp/testdb目录下,看到以下几个文件: [root@localhost testdb]# cd /tmp/testdb/ [root@localhost testdb]# ll total 16 -rw-r--r-- 1 root root 34 Oct 14 03:45 000003.log -rw-r--r-- 1 root root 16 Oct 14 03:45 CURRENT -rw-r--r-- 1 root root 0 Oct 14 03:45 LOCK -rw-r--r-- 1 root root 77 Oct 14 03:45 LOG -rw-r--r-- 1 root root 50 Oct 14 03:45 MANIFEST-000002 [root@localhost testdb]# pwd /tmp/testdb [root@localhost testdb]#
喜欢用Java的同学可以引入对应的文件包同样可以完成上面的操作,POM文件: org.iq80.leveldb leveldb-api 0.12 org.iq80.leveldb leveldb 0.12
Java代码: import org.iq80.leveldb.DB; import org.iq80.leveldb.DBFactory; import org.iq80.leveldb.Options; import org.iq80.leveldb.impl.Iq80DBFactory; import java.io.File; import java.io.IOException; public class TestLevelDB { public static void main(String[] args) throws IOException { DBFactory factory = new Iq80DBFactory(); Options options = new Options(); options.createIfMissing(true); DB db = factory.open(new File("/tmp/testdb"), options); db.put(Iq80DBFactory.bytes("leveldb") , Iq80DBFactory.bytes("It is leveldb.")); byte[] bytes = db.get(Iq80DBFactory.bytes("leveldb")); System.out.println(Iq80DBFactory.asString(bytes)); } }总结
通过以上内容,我大概了解到了一些leveldb的特性和不足,并且做了简单的上机实验。更多功能测试,可以参考官方文档。后续我们将系统阐述leveldb各模块实现以及模块之间如何协作高效完成文件的读写能力。
资料参考:
基本概念 — leveldb-handbook 文档
Leveldb 基本介绍和使用指南 - 掘金 (juejin.cn)
头条居然不支持外链!
徽风美宿迎客天下!同程旅行徽州民宿市场发展白皮书解读编者按民宿是乡村文旅的新型载体,是满足民众美好生活需求的新兴业态,发展乡村民宿产业是实现乡村振兴的重要路径。近年来,黄山市借势全域旅游发展,依托自然文化生态等资源优势,把民宿业发展
RCEP实施一周年带来巨大红利(文潘强周强黄浩铭郭轶凡)在广东深圳华丝企业股份有限公司的生产车间里,鲜艳又柔软的丝绸如流水一般在机器间蜿蜒盘旋,它们即将被制成各类华服,运往世界各地。2022年出口日本市场的衣服
俄罗斯高明吗?俄乌战争中,如何理解俄罗斯的高明战术?俄罗斯在普京治下已经二十年有余了,这不像西方国家两党消磨,政策摇摆,普京的西方看也摇摆,不过就算不再摇摆这段时间也很久了,战争准备也许十几年前
延期服役,画好军旅延长线第74集团军某旅一级上士王振兴没想到,自己的军旅生涯真的画上了延长线。延期服役申请被批准那天,王振兴正在执行训练保障任务。得知消息,他很高兴虽然军衔没有变化,但肩上的责任更重了。延
宁白湖边鱼那时,湖里的鱼,都直接游向了餐桌。听一位渔佬儿站在岸边说湖里的鱼捞来现煮,不用姜酒。说的是活鱼之鲜美,却把鱼厨的技艺贬为无聊。40年前,淳安是个遥远的地方,山峦连绵。从杭州开车,在
书是人类进步的阶梯如果问我最忠实的朋友是谁?那非书莫属了!我最喜欢的事情就是读书。握一卷诗书,添一杯香茗,盘膝而坐,让暗香盈袖。书陪伴着我走过每个岁月,它似一个跳跃的音符,也似一幅流光溢彩的画面。它
垂直社交类互联网企业不断增加,这类企业到底有何盈利模式?互联网在经过了数十年的发展后进一步贴近了大众的生活,提高了大众的生活质量。自2011年以来,我国互联网步入迅猛发展的阶段,垂直化发展是这个阶段的主要趋势。相应产生的结果就是越来越多
新春走基层快递企业日薪千元招人?成都地区快递用工整体平稳封面新闻记者马梦飞兔年春节渐近,春节假期也即将到来,与此同时,快递企业迎来了一年当中最繁忙的时段之一。今年,不出意外的是,各家快递公司均喊出了春节不打烊的口号,曾经作为行业优势的一
中国梦大国工匠篇丨张存升科技创新淬炼金刚钻走进河南省力量钻石股份有限公司激光切割厂房内,30多台切割机激光闪耀,数控监测器上,一道道白光不断围绕着一个个小方块展开精准切割,小方块不足以厘米计。车间内,在张存升的操作下,30
美国小弟韩国等举起大棒叫我们过去旅游,你去吗?韩国欢迎中国游客早日到访济州韩国日本等国家为了讨好美国大哥,操弄ZZ,以防止疫情扩散为由,区别对待我国游客。我国进行了反制,暂停了短期签证。美国的小弟们现在知道日子不好过,马上又要
OpenAI生态圈OpenAI大未来的关键点你好,这里是科技前哨,今天继续跟你分享人工智能领域有关的新鲜见闻。最近,科技前哨的小伙伴发现,我们做了不少人工智能领域的相关研究,都有提到OpenAI,却始终没有介绍过这家超级独角