閱讀209 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[leveldb] 與大神對話錄——開啟 leveldb 之旅

[TOC]

我的建議建議是多研究一些好項目,不要成為“語言學家”!

從一篇朋友圈說起

我發了一條朋友圈,打算把C++所有語法過一遍。發現自己之前學C渣渣學得太渣了,老是和 C語言的混在一起理解,發現 C++保留的結構體 struct 就和 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語言的靜態庫與共享庫 https://blog.csdn.net/u014134180/article/details/78335274

得到C++之父的真傳

隻看圖,不說話。

AB823D4ECABE3385E36AD2D271E87902
A3BB0A93805D0855323CFF82D80D7A85
D731BCAC368E01BCD0B8714253966543

Wu_Being博客聲明:本人博客歡迎轉載,請標明博客原文和原鏈接!謝謝!
《[leveldb] 與大神對話錄——開啟 leveldb 之旅》: https://yq.aliyun.com/articles/241607

最後更新:2017-11-13 18:04:13

  上一篇:go  Aliplayer快速入門:資源引用、添加容器元素與初始化
  下一篇:go  6年雙11,DataV的數據可視化之道