由于最近在做分布式存储系统,需要一个小、性能好、靠谱的存储引擎,我们瞄准了Kyoto Cabinet,希望通过分析源码能对它进行改造成我们需要的引擎,这一工作落在我身上,于是我花了一星期时间彻底地分析了Kyoto Cabinet源码,下面将分享下由Kyoto Cabinet源码分析出的实现原理。
下面主要分析hashdb和treedb这两种存储结构,其他的要么简单,要么类似,就不分析了。
一、hashdb
hashdb,顾名思义就是哈希表,只是哈希表存放在文件系统而不是内存,复杂度比存在内存大多了,冲突采用链表或二叉树解决。
大家对哈希表应该都比较熟悉,它由三要素组成:哈希函数,哈希表和冲突解决方法。在无冲突情况下,查找、插入和更新复杂度为O(1);有冲突情况下的复杂度就视冲突情况来定复杂度了。增加哈希表的桶数,可以减少冲突,但会牺牲空间,所以具体应用时,需要权衡冲突和空间。
下面分别对上面介绍的三要素是如何hashdb实现的。
(1)哈希函数
hashdb的哈希函数是采用MurMur算法。具体可以看维基百科的介绍:http://zh.wikipedia.org/wiki/Murmur%E5%93%88%E5%B8%8C,实现函数是hashmurmur,这里就不贴代码了。
(2)哈希表
hashdb的哈希表是文件系统里一个文件,它的结构由下面图所示: