zoukankan      html  css  js  c++  java
  • 实现了一个简单的key-value存储系统

    实现了一个简单的key-value存储系统

    源码下载:

      kvfs.rar

    正文:

      所谓的Key-Value就是每次存储一个数据时,是根据Key进行索引存储的。为了实现Key的快速查找功能,我使用了B-tree存储结构。B-tree被大量用于数据库的索引中,所以选用B-tree想必不会有太大的问题。Value是对应该Key的值,他的长度是未知的,所以要实现这样一个存储系统,必须要解决从Key值到文件位置的映射关系。

    问题一:实现文件的"自由"读写
    问题二:实现BTree

    问题一:实现文件的"自由"读写。
      基本思想:所有内容被存储到一个文件中,文件被划分成同一大小的粒度,可以自由的申请不同的大小空间,可以释放已经申请的空间。使得文件操作可以和内存操作接口一致。
      基于上述的需求,我的文件存储结构如下图所示:
           数据存储结构

    复制代码
     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. 将使用块移动至"空闲列表"。使得该块可以被重新申请。
     
      处理申请空间和释放空间外,还实现了读,写,重新申请空间功能。
     

    问题二:实现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( )            关闭一个数据库

     
     
    分类: C我的软件
  • 相关阅读:
    94. Binary Tree Inorder Traversal
    101. Symmetric Tree
    38. Count and Say
    28. Implement strStr()
    实训团队心得(1)
    探索性测试入门
    LC.278. First Bad Version
    Search in Unknown Sized Sorted Array
    LC.88. Merge Sorted Array
    LC.283.Move Zeroes
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3253467.html
Copyright © 2011-2022 走看看