[非技术向]LevelDb源码阅读总结

February 17, 2017 at 1:19 pm

又是一段时间没有更新博客了。这段时间主要有两件事,一件还是在过春节假期,另一件则是在抄写(真正意义上的抄写)LevelDb。抄写的过程根据git的提交记录来看从1月14日到2月16日大约一个月的时间,按照实际的提交次数来看,大约是不到两周,每天约6个小时,抄写的是LevelDb的1.7.0版本,原版本刨去测试性的代码大约1.3万左右,最后总计抄的大约1.2万,因为按照计划昨天应该要干完这件事,今天写个总结,所以稍微有些烂尾(挖坑不填的本性暴露无疑)。整体上基本保证了可运行,昨天或多或少修了重写抄过程中的的一些错误,基本的std::map型的功能可以得到保证,但是真正要拿来用是不太现实的,可能还存在很多bug,代码仅仅自己可以用了吧。本来打算在抄完之后写一点具体一点、技术性强一点的总结,最后发现,毕竟BigTable已经10多年,LevelDb也有六七年的历史了,相关的技术性文章很多,网上中文的源码解析也非常多非常全,所以最后打消了这种想法,打算写一篇对源码阅读抄写的认识、和阅读LevelDb的源码过程中的一些收获。 本文主要有以下几个小节: 1. 对LevelDb源码进行阅读的初衷 2. 源码抄写的一些感想 3. 从抄写中学到的一些东西 这里列出两篇个人觉得LevelDb源码解析的比较技术向、全面、透彻的中文文章以避免吃瓜观众不小心踩了坑不好跳出去: malolk.com/2016/10/11/leveldb-1.19源码阅读/ www.qkldx.net/topic/64/leveldb原理探究与代码分析 对LevelDb源码进行阅读的初衷 LevelDb是由Google的两位大牛Jeffrey Dean和Sanjay Ghemawat编写的开源的持久化KV存储的库(这两位也是BigTable论文的主要作者之二),在写这篇文章时(2017-2-17)已经发布1.18版本,源码现在已经托管在github上,并遵循New BSD协议。LevelDb的最初版本就考虑可移植性,所以现在应该支持大多的主流平台,具体的我就懒得查了。LevelDb自身是以库的形式提供的,而不是一个完整的数据库产品,没有服务器端、通信协议之类的约定,仅仅是做存储,所以阅读LevelDb的源码是无法看到一个完整的数据库的全貌的;LevelDb是inpired by BigTable的,简单地可以理解为BigTable的一个开源实现,它的整体设计,包括MemTable, SSTable,都和BigTable论文中描述的基本一致;我看的是相对早期的版本1.7.0,没有和现在的版本做过完整的对比,但从部分文件的对比来看没发现有什么较大变化;LevelDb 1.7.0由C++写成,有一个简单的C接口,整体大约1.8万行的代码,除去C接口、移植性相关代码、测试相关代码后大约1.3万行,属于可以全部阅读的代码量。 […]