程序员架构师最值得推荐的谷歌开源项目

如果说要推荐一个值得学习的开源项目,很多人都会选择LevelDB,它是一个由Google公司所研发的键/值对单机嵌入式数据库管理系统编程库,以开源的BSD许可证发布。今天我们先简单的看一下LevelDB,膜拜一下Google大神。虽然levelDB是用C/C++编写的,但无论是对于JAVA还是PHP的开发甚至是前端开发都是值得学习的,levelDB的很多设计思想值得学习!毕竟计算机的底层与思想,都是共通的。

学习一个项目,我的建议是按照了解背景、适用场景、优缺点、主要模块、运行过程、思想还有更多细节这样的步骤,会让我们更加有条理。

背景

首先我们先看看这个开源项目解决了什么问题?众所周知,传统的机械硬盘因为寻道的问题,随机读写跟顺序读写的性能差距很大,即便是SSD,市面上绝大部分的普通SSD硬盘,顺序读写的性能有M/s,但是随机写的性能很多就只有50M了。(当然市面上也有随机写性能很高的硬盘,价格大家也可以了解下)所以LevelDB最主要解决的,就是随机写造成的磁盘性能下降问题。

场景

所以leveldb最适用的场景,正是这种写多的场景。最典型的莫过于IM系统,用户的每次聊天都伴随着数据的写入。根据谷歌提供的测试数据,在一台普通的英特尔酷睿4核处理器,普通机械硬盘,数据大小为字节,随机读可以达到6万/s的性能,而随机写可以达到百万级别。

主要模块

API模块:即对外接口,常用的功能有读、写、快照等。

Oplog:这个是操作记录文件。Oplog的本质是共享内存写文件,大大提升了操作的效率。这个模块的主要是什么呢?就是记录操作日志?主要作用是什么呢?先给大家思考一下。

Memtable:memtable是内存中用来记录数据的,它的实现实际上是一个跳表。什么是跳表呢?跳表主要用来替代平衡树,使用过概率的来建立跳跃的链表,从而达到快速插入、查询、删除的数据结构,他的算法复杂度是O(NlogN),但实际上会比红黑树这类平衡树稍微节省点性能。

Immutablememtable:跟memtable类似,他的作用是要存放落到数据库的数据。

sstable:是Leveldb的持久化存储,后台会定时的将内存的数据存到磁盘里面,每次都是顺序写入,这里你可能有疑问,如果一个key被删除了,怎么办?是否还是顺序写入呢?没错,还是继续顺序写入,然后再这条数据上打上一个删除标签。同理,更新也是一样的道理,每次都是追加写。如果你是一个合格的程序员/架构师,这个时候肯定会问,那么日积月累下,无用的数据岂不是越来越多?!答案是肯定的,为了解决这个问题,leveldb每个一段时间会把文件进行合并,合并完之后存到下一个层级(level),这也是leveldb的名字由来。

运行过程

那么插入一个数据的流程是什么样的呢?首先是进入API层,然后就写操作日志OPLog,写着就写数据到内存,全部成功后返回成功。如果你是一个合格的程序员/架构师,肯定会提出这样的问题,如果中途crash了或者机器断电,数据来不及写入磁盘,岂不是会丢数据!这便是我们之前提出问题的答案,OPLog是共享内存写文件,所以将便是断电,也能够从日志中恢复文件出来。

底层原理与核心代码

Leveldb的核心原理是通过追加写从而改善写磁盘的性能,重要的事情只说一遍。另外一些比较巧妙地设计有LSMTree、快照、LRU缓存、Level堆叠等等等,尽管leveldb只有1万多行代码,但几乎每个模块都有非常值得每一个程序员学习、架构师思考跟学习的地方,后面我会继续庖丁解牛,逐个逐个分析Leveldb的巧妙实现。

好了,今天我们先介绍到这里,如果你有什么疑惑,欢迎提问,我们再接下来的文章中,一起解答。




转载请注明:http://www.aierlanlan.com/rzdk/5473.html

  • 上一篇文章:
  •   
  • 下一篇文章: