源码下载:数据库
kvfs.rar缓存
正文:数据结构
所谓的Key-Value就是每次存储一个数据时,是根据Key进行索引存储的。为了实现Key的快速查找功能,我使用了B-tree存储结构。B-tree被大量用于数据库的索引中,因此选用B-tree想必不会有太大的问题。Value是对应该Key的值,他的长度是未知的,因此要实现这样一个存储系统,必需要解决从Key值到文件位置的映射关系。测试
问题一:实现文件的"自由"读写
问题二:实现BTree优化
问题一:实现文件的"自由"读写。
基本思想:全部内容被存储到一个文件中,文件被划分红同一大小的粒度,能够自由的申请不一样的大小空间,能够释放已经申请的空间。使得文件操做能够和内存操做接口一致。
基于上述的需求,个人文件存储结构以下图所示:
atom
1 typedef struct _diskatom{ 2 int64 self; //自身索引 3 int64 next; //下一索引 4 int64 pre; //前一索引 5 int64 ext; //扩展索引 6 int size; //大小 7 unsigned char info; //信息[1:HEAD|1:USED|0|0|0|0|0|0] 8 unsigned char dirty; 9 unsigned char data[DISK_ALLO_SIZE]; 10 }diskatom_t; 11 12 typedef struct _diskctx{ 13 int64 ctxtop; 14 int64 num_used; 15 int64 num_free; 16 diskatom_t list_used; 17 diskatom_t list_free; 18 }diskctx_t;
申请空间:
1. 计算申请大小须要几块空间。
2. 检查空闲列表中是否有足够的空间。
3. 存在足够的空闲块,将空闲块移动至"使用列表"。
4. 空闲空间不足,扩充文件大小,将新增块插入"使用列表"。
释放空间:
正好和申请空间相反。
1. 将使用块移动至"空闲列表"。使得该块能够被从新申请。
处理申请空间和释放空间外,还实现了读,写,从新申请空间功能。
spa
问题二:实现BTree
摘录百科百科对BTree的描述:
B-tree(多路搜索树,并非二叉的)是一种常见的数据结构。使用B-tree结构能够显著减小定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B一般认为是Balance的简称。这个数据结构通常用于数据库的索引,综合效率较高。
http://baike.baidu.com/view/363832.htm
咱们有了上面(问题一)的读写文件的功能,那么将B-tree创建到文件中去,和将之创建到内存,实际上是同样的。B-tree的内容在网上均可以找到。只不过在操做节点的内容时,咱们可能要去读写文件。原来在内存中的指针,如今变成了在文件中的位置。翻译
测试功能:
如今软件实现了如下的功能,用于操做Key-value数据库。在效率方面,写1万个数据大体在350ms吧,查找读取的速度比写快一倍左右;因为是直接写硬盘,没有缓存机制,效率也只能这样。先把功能实现了再优化吧。
open( dbpath ) 打开一个数据库
set( container, key, value ) 增长/设置一个Key
get( container, key ) 获取一个Key的内容
del( container, key ) 删除一个Key
close( ) 关闭一个数据库指针