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

正文:

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

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

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

基本思想:所有内容被存储到一个文件中,文件被划分成同一大小的粒度, 可以自由的申请不同的大小空间,可以释放已经申请的空间。使得文件操作可以和内存操作 接口一致。

基于上述的需求,我的文件存储结构如下图所示:

typedef struct _diskatom{
    int64 self;    //自身索引
    int64 next;    //下一索引
    int64 pre;    //前一索引
    int64 ext;    //扩展索引
    int size;    //大小
    unsigned char info;    //信息[1:HEAD|1:USED|0|0|0|0|0|0]
    unsigned char dirty;
    unsigned char data[DISK_ALLO_SIZE];
}diskatom_t;

typedef struct _diskctx{
    int64 ctxtop;
    int64 num_used;
    int64 num_free;
    diskatom_t list_used;
    diskatom_t list_free;
}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( )            关闭一个数据库

源码下载: http://files.cnblogs.com/linxr/kvfs.rar

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索存储
, 文件
, 索引
, tree view
, 空间
, key-value
, 一个
, B-Tree
, 存储大小未知
自由块
key value存储原理、key value存储系统、shell key value 存储、key value存储、keyvalue存储数据库,以便于您获取更多的相关知识。

时间: 2024-05-25 18:48:43

一个简单的key-value存储系统的实现的相关文章

web.config文件自定义配置节的使用方法的一个简单例子

web web.config文件自定义配置节的使用方法的一个简单例子用来演示的程序名为MyApp,Namespace也是MyApp 1.编辑web.config文件 添加以下内容,声明一个Section <configSections>    <section name="AppConfig" type="MyApp.AppConfig, MyApp" /> </configSections>   声明了一个叫AppConfig的

一个简单的HashMap C语言实现

用C语言实现一个简单实用的hashmap,具有一定的实际意义.尤其我们不想使用STL里面的map<...>类的时候.我实现的这个hashmap,用来做key---value的映射,key必须是有效的字符串,value是调用者分配的任意类型的数据.这个hashmap适合在一些简单的场合下,消耗极少的资源. 首先定义头文件如下: /* * hashmap.h * Generic hash map: key(string)-value(any type). * cheungmine * Sep. 2

C语言实现一个简单的单向链表list

用C语言实现一个简单实用的单向链表list,具有一定的实际意义.尤其我们不想使用STL里面的list<...>类的时候.我实现的这个list,结点存储任何调用者分配的任意类型的数据(void*).这个list适用于一些简单的场合,消耗极少的资源. 头文件: /* * list.h * Generic sequential linked list node structure -- can hold any type data. * cheungmine * Sep. 22, 2007. All

一个简单的Generic Factory类

简单的工厂类的一个使用场景是,假设有一个基类 BaseClass,和一系列的子类 A,B,C,工厂类根据某个参数,例如字符串 "A", "B", "C" 创建出相应的子类. 举例如下: public class Factory { public static BaseClass Create(string name) { switch (name) { case "A": return new A(); case "

Python写的一个简单监控系统

  这篇文章主要介绍了Python写的一个简单监控系统,本文讲解了详细的编码步骤,并给给出相应的实现代码,需要的朋友可以参考下 市面上有很多开源的监控系统:Cacti.nagios.zabbix.感觉都不符合我的需求,为什么不自己做一个呢 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 首先数据库建表 建立一个数据库"falcon",建表语句如下: ? 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE `stat` ( `

Python实现一个简单的能够上传下载的HTTP服务器

这篇文章主要介绍了用Python实现一个简单的能够上传下载的HTTP服务器,是Python网络编程学习当中的基础,本文示例基于Windows操作系统实现,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 5

一个简单不报错的summernote 图片上传案例_javascript技巧

一个比较完整的summernote上传图片的案例,没有后台(上传图片网上案例太多),只有前端js.修正了网上提供的,但是有bug的代码. 这个例子,js保证不报错.亲测可用 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html > <html> <head&

数据库一个简单的计算列问题

问题描述 数据库一个简单的计算列问题 定义学生表,其中规定: ? ? 学号列是主关键字: 院系列为计算列(取学号列的第 3 和第 4 个字符) ,并且院系值参照院系表的编号值(院 系表是被参照表,主关键字是编号:参照表是学生表,外部关键字是院系) ,此约束说明 一名学生一定属于某个院系: ? ? ? 姓名列不允许为空值: 性别必须取值"男"或"女": 学生的学籍状态为正常.留级.休学或退学. 代码: create table student.学生 (学号 char(

从一个简单的约束看规范性的SQL脚本对数据库运维的影响

原文:从一个简单的约束看规范性的SQL脚本对数据库运维的影响   之前提到了约束的一些特点,看起来也没什么大不了的问题,http://www.cnblogs.com/wy123/p/7350265.html以下以实际生产运维中遇到的一个问题来说明规范的重要性. 如下是一个简单的建表脚本,表面上看起来并没有什么问题.其中创建了3个约束,一个主键约束,一个唯一约束,一个默认值约束,该脚本执行起来没有任何问题. USE Test GO if exists(select 1 from sys.table