[leveldb] 與大神對話錄——開啟 leveldb 之旅
[TOC]
我的建議建議是多研究一些好項目,不要成為“語言學家”!
從一篇朋友圈說起
我發了一條朋友圈,打算把C++
所有語法過一遍。發現自己之前學C渣渣學得太渣了,老是和 C語言的混在一起理解,發現 C++
保留的結構體 struct 就和 C語言的有區別:
- C語言的結構體的成員變量默認是公有的,而
C++
的結構體成員變量默認是私有的; -
C++
結構體可以聲明定義函數,而 C語言結構裏隻是聲明為指針函數,並在外部實現;
這裏不要討論C艸
的地方,以後有機會在發出相關的介紹文章吧!
這條朋友圈被一個研究數據庫底層的牛逼師兄留意到了,評論: “我的建議是多研究一些好項目,不要成為語言學家”。
牛逼師兄的指導
- 吳兵:有沒有比較小一點的開源項目推薦給我學習研究研究。
- 師兄:那我就推薦一個吧,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嗎
-
- 師兄:都是一脈相傳的東西,可以認為是當前最值得研究的C++項目了
- 吳兵:哦哦哦, 好的
- 師兄:leveldb有些源碼剖析的東西,可以快速掃一下。 用git clone下來,看下git log,還有對應的work log,研究它的演化過程。最重要的是要理解它的深層思維,懂得它為什麼這個樣子和怎麼發展到這個樣子 。
- 師兄:停留在研究語法和簡單的代碼,進步很慢其實也沒啥用。
- 吳兵:是啊,看這種提交log嗎
- 師兄:嗯。但是leveldb你看git log 都很早了,現在rocksdb源碼還是很活躍的, 每個月都新增很多代碼, 像這種新增一個功能進去
- 師兄:git log裏有個網址, https://github.com/facebook/rocksdb/pull/2202 ,像這個裏就有討論代碼怎麼寫
- 吳兵:怎麼看到這個提交修改了那些代碼
- 師兄: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語言的靜態庫與共享庫 https://blog.csdn.net/u014134180/article/details/78335274
得到C++之父的真傳
隻看圖,不說話。
Wu_Being博客聲明:本人博客歡迎轉載,請標明博客原文和原鏈接!謝謝!
《[leveldb] 與大神對話錄——開啟 leveldb 之旅》: https://yq.aliyun.com/articles/241607
最後更新:2017-11-13 18:04:13