[leveldb] 与大神对话录——leveldb

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 这篇是研究 levedb 键值数据库的开端篇!

[TOC]

建议是多研究一些好项目,不要成为“语言学家”!

从一篇朋友圈说起

我发了一条朋友圈,打算把C++所有语法过一遍。发现自己之前学C渣渣学得太渣了,老是和 C语言的混在一起理解,发现 C++保留的结构体 struct 就和 C语言的有区别:

  • C/C++语言的结构体的成员变量默认是公有的,而 C++的类成员变量默认是私有的;
  • C++结构体可以声明定义函数,而 C语言结构里只是声明为指针函数,并在外部实现;

这里不要讨论C艹的地方,以后有机会在发出相关的介绍文章吧!

这条朋友圈被一个研究数据库底层的牛逼师兄留意到了,评论: “我的建议是多研究一些好项目,不要成为语言学家”

QQ20171113_103022

牛逼师兄的指导

  • 吴兵:有没有比较小一点的开源项目推荐给我学习研究研究。
  • 师兄:那我就推荐一个吧,MySQL。可以研究一下mysql with rocksdb :https://github.com/facebook/mysql-5.6 。你可以研究一下其中的myrocks —— rocksdb引擎
  • 吴兵:文档还是mysql官网的吗
  • 师兄:rocksdb引擎的 文档你就只能从github上看
  • 吴兵:哦哦哦
  • 师兄: 学习c++的话,在以前的话,leveldb是很推荐的, jeff dean写的,代码写得很规范。 rocksdb是facebook基于leveldb去二次开发的,现在大家都是在用rocksdb而不会直接去用leveldb
  • 吴兵:google的leveldb吗
  • QQ20171113_105432
  • 师兄:都是一脉相传的东西,可以认为是当前最值得研究的C++项目了
  • 吴兵:哦哦哦, 好的
  • 师兄:leveldb有些源码剖析的东西,可以快速扫一下。 用git clone下来,看下git log,还有对应的work log,研究它的演化过程。最重要的是要理解它的深层思维,懂得它为什么这个样子和怎么发展到这个样子
  • 师兄:停留在研究语法和简单的代码,进步很慢其实也没啥用。
  • 吴兵:是啊,看这种提交log吗
  • 师兄:嗯。但是leveldb你看git log 都很早了,现在rocksdb源码还是很活跃的, 每个月都新增很多代码, 像这种新增一个功能进去
  • 1_pic
  • 师兄:git log里有个网址, https://github.com/facebook/rocksdb/pull/2202 ,像这个里就有讨论代码怎么写
  • QQ20171113_105817
  • 吴兵:怎么看到这个提交修改了那些代码
  • 师兄:github上每一个提交都能看到对应的修改, 更方便的当然是git clone到本地,我一般会用可视化的git工具来看代码修改, linux下的话像gitg,win下的话像source tree
  • 吴兵:gitk吗
  • 师兄:挺多工具的,看代码的话,对着git log看是最快能理解的
  • 吴兵:这个 pull request是分支请求合并到这个干支的吗
  • 师兄:嗯,合并到了原来项目的主分支了
  • 吴兵:很多项目都有这个文件.travis.yml,.gitignore。这是做什么的
  • 师兄: gitignore是git用来过滤那些不用作版本管理的文件,比较 .o .so .a这种编译代码时会产生的文件,另一个文件我就不知道了
  • 师兄: 搞这种大型项目就是要以点带面,慢慢地就能搞懂了, 如果一下看不懂,也不要轻易放弃,继续多看多琢磨
  • 吴兵: [GitHub - google/leveldb at f67e15e50f392625b4097caf22e8be1b0fe96013 : https://github.com/google/leveldb/tree/f67e15e50f392625b4097caf22e8be1b0fe96013]
  • 师兄:什么问题?
  • 吴兵:这个第一次提交交了那么多代码,是实现一个demo吧。 这个demo原理怎么研究[捂脸]
  • 师兄:这个是它第一次搬到github上的代码,看它的git log上写着另一个网址,是原先在googlecode上的。你可以先搜一下level的源码分析看看,看个大概就行。
  • 吴兵:喔喔
  • 师兄:理解一下 lsm树,理解 compaction,还有 version set
  • 吴兵:version set是数据结构吗
  • 师兄:不是。
  • 吴兵:什么玩意
  • 师兄: version set version edit是leveldb用来管理sst文件版本的一套机制,如果我没记错的话。不要贪多,你可以就研究一下version set的代码
  • 吴兵:编译后出来了out-shard和out-static目录,要怎么使用这个数据库
  • 师兄: leveldb并不算是个数据库,它只是kv存储系统
  • 师兄:别的系统可以用它来做存储引擎。 通过动态链接或者静态链接的方式集成进来如果你写程序,需要存放数据,你可以用leveldb来存。然后编译你的代码的时候将leveldb的静态库或者动态库引进来就行了。
  • 师兄:facebook将leveldb做了很多扩展,然后用作了mysql的一个存储引擎。
  • 吴兵:https://www.zhihu.com/question/38933764/answer/80312254 。sugar,原来 当作库来调用
  • 师兄:在我们的txsql里,我就把rocksdb打包成.so,可以运行时选择是否装载。
  • 吴兵:这是我 总结的C语言的静态库与共享库 http://blog.csdn.net/u014134180/article/details/78335274

得到C++之父的真传

只看图,不说话。

AB823D4ECABE3385E36AD2D271E87902
A3BB0A93805D0855323CFF82D80D7A85
D731BCAC368E01BCD0B8714253966543

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《大神对话录——leveldb》: https://yq.aliyun.com/articles/241361/

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
存储 缓存 NoSQL
LSM-Tree - LevelDb了解和实现
LSM-Tree - LevelDb了解和实现
78 0
|
7月前
|
消息中间件 存储 NoSQL
LevelDb跳表实现
LevelDb跳表实现
58 0
|
7月前
|
存储 NoSQL Java
LSM-Tree - LevelDb 源码解析(二)
LSM-Tree - LevelDb 源码解析(二)
160 0
|
7月前
|
存储 设计模式 NoSQL
LSM-Tree - LevelDb 源码解析(一)
LSM-Tree - LevelDb 源码解析(一)
85 0
|
7月前
|
NoSQL 测试技术 C++
LSM-Tree - LevelDb布隆过滤器(二)
LSM-Tree - LevelDb布隆过滤器
91 0
LSM-Tree - LevelDb布隆过滤器(二)
|
7月前
|
存储 NoSQL 安全
LSM-Tree - LevelDb布隆过滤器(一)
LSM-Tree - LevelDb布隆过滤器
114 0
LSM-Tree - LevelDb布隆过滤器(一)
|
7月前
|
缓存 NoSQL 关系型数据库
LSM-Tree - LevelDb之LRU缓存(二)
LSM-Tree - LevelDb之LRU缓存
127 0
LSM-Tree - LevelDb之LRU缓存(二)
|
7月前
|
存储 缓存 NoSQL
LSM-Tree - LevelDb之LRU缓存(一)
LSM-Tree - LevelDb之LRU缓存
143 0
LSM-Tree - LevelDb之LRU缓存(一)
|
存储 Java 测试技术
Boltdb 源码导读(一):Boltdb 数据组织(1)
Boltdb 源码导读(一):Boltdb 数据组织(1)
196 0
Boltdb 源码导读(一):Boltdb 数据组织(1)
|
缓存 NoSQL Go
Boltdb 源码导读(一):Boltdb 数据组织(2)
Boltdb 源码导读(一):Boltdb 数据组织(2)
278 0
Boltdb 源码导读(一):Boltdb 数据组织(2)