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

[TOC]

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

从一篇朋友圈说起

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

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

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

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

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

牛逼师兄的指导

  • 吴兵:有没有比较小一点的开源项目推荐给我学习研究研究。
  • 师兄:那我就推荐一个吧,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吗
  • [leveldb] 与大神对话录——leveldb
  • 师兄:都是一脉相传的东西,可以认为是当前最值得研究的C++项目了
  • 吴兵:哦哦哦, 好的
  • 师兄:leveldb有些源码剖析的东西,可以快速扫一下。 用git clone下来,看下git log,还有对应的work log,研究它的演化过程。最重要的是要理解它的深层思维,懂得它为什么这个样子和怎么发展到这个样子
  • 师兄:停留在研究语法和简单的代码,进步很慢其实也没啥用。
  • 吴兵:是啊,看这种提交log吗
  • 师兄:嗯。但是leveldb你看git log 都很早了,现在rocksdb源码还是很活跃的, 每个月都新增很多代码, 像这种新增一个功能进去
  • [leveldb] 与大神对话录——leveldb
  • 师兄:git log里有个网址, https://github.com/facebook/rocksdb/pull/2202 ,像这个里就有讨论代码怎么写
  • [leveldb] 与大神对话录——leveldb
  • 吴兵:怎么看到这个提交修改了那些代码
  • 师兄: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++之父的真传

只看图,不说话。

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

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

上一篇:[从C到C++] 1.4 C++命名空间(namespace)


下一篇:Android Source 文档(微调-电耗-1概览)感谢Google.cn,附链接。