一个简单的nosql数据库vDB的实现

github地址:https://github.com/viktorika/vDB.git

参考资料

这份代码是参考APUE写的,采用的结构跟书里是一模一样,不一样的只是代码风格以及部分细节上的区别,所以本文下面所说的实现则是解释一下APUE是怎么做的。

数据库文件类型

首先得讲讲这个数据库会生成两个文件。

1.索引文件.idx

2.数据文件.dat

数据库文件存储结构

再来讲讲里面的结构,索引文件采用的是hash表结构。采用链表来解决冲突,所以每个节点都会有一个指针会指向下一个节点,这个指针在文件中表现为偏移量,这里我们统一称呼它为ptr结构。

首先我们将.idx文件分成两部分

1.前半部分,空闲链表头节点+hash表所有节点的头节点

2.后半部分,一个个index记录,不管是空闲的节点还是非空闲的节点他们都是一个index记录。

假设我们一 个ptr的大小为ptr_size,hash表的大小为hash_table_size,那么前半部分占用的字节数就为(hash_table_size + 1) * ptr_size。

这里我们表示空白的话是用空白符' '来填充的。

再来说说一个index记录的结构

这个记录我们分成三部分

1.刚刚所说的ptr。

2.真正index记录的长度(长度是用固定字节数的所以无需分隔符,这个字节数用index_size来代替)。

3.真正的index记录。

真正的index记录的格式是这样的:

xxx:xxx:xxx\n

':'符号为分隔符,\n是终止符,每条记录最后都是有\n来终止的,data记录也是一样的。

通过':'符号分成了三部分。

1.key。

2.data在.dat文件中的偏移量。

3.data的偏移量。

这就是一个完整的index记录。

最后说一下data记录

这个其实没什么好说的了,就是每条记录都由\n来隔开。

 

具体实现请到github上自行看代码,已经做了详细的注释。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章