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我的软件
  • 相关阅读:
    Java面试题(转)
    哪种方式更适合在React中获取数据?
    vue学习之深入响应式原理
    还不会用FindBugs?你的代码质量很可能令人堪忧
    几道大数据面试题(转)
    【Medium翻译】Java抽象类有什么用?
    深入理解Kafka必知必会(上)
    (八十六)c#Winform自定义控件-表格优化(转载)
    IDEA 配置及常用快捷键
    Markdown 复杂公式&常用符号
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3253467.html
Copyright © 2011-2022 走看看