自己写了一个NOSQL数据库

失业在家无聊花了2个月不到的事件自己写了一个nosql数据库

码云地址:https://gitee.com/tcyjc/memory_db_linux

内存文件代码:https://gitee.com/tcyjc/memory_db_cpp_linux

 

  • 简介

这个是一个nosql数据库实现,提供快速增删查等操作。程序会对输入数据建立索引文件及索引,为快速查找提供支持。程序应用场景是,给一些无法部署数据库的机器,提供一个无需安装,无需部署直接在程序中引用即可使用的数据库。

程序支持数据库一些常规的操作,如插入操作,范围查询,多条件查询,删除等,用户可以通过查询回调自定义数据处理逻辑。

因为是nosql数据库,所以并不需要具体定义表结构,程序会在每次插入时使用字段名自动创建字段索引。所有的字段都会建立索引并进行排序存储。

设计程序初衷希望程序可以按表,按库,按组进行分布式部署,即将数据库拆散至多个服务器上,之后也会向这个方向修改。

  • 索引基础对象

IndexBase

这是一个内存文件索引对象,它会根据组名(group name)打开或创建一个(或一批)内存文件(文件映射入内存),并用“0”填充满文件,所有索引并非存储在同一个文件里,当程序发现文件使用已经超过阈值就会创建新的文件(单个索引文件大小由配置文件决定),同一组索引文件组成了“索引组”的概念,对象还会创建一个用于存储组信息的配置文件(setting.cfg)用于管理组信息。

IndexBase对象结构上是一个链表,所有数据插入时会进行排序(并非必须),setting.cfg里存储着链表的头部信息,如:最大值最小值和总数量为索引提供支持。

DataBase

这是数据存储的文件,用于存储最原始的实际数据内容,索引创建完后会调用此对象存储实际数据内容,并返回存储位置,对象在初始化时会一次打开多个文件,在多线程情况下会将数据分别写入不同的文件以提高读写速度(实际使用cython时并没有效果)

  • 查询对象

CacheBase:

对象,你可以直接把这个对象理解为数据的一张表,它存储这所有被插入的字段对象,同时提供了一个简单的查询分析。

查询分析原则:

  1. 如果查询条件中有“=”(字段相等)的条件,并且获取此索引头信息返回的索引个数,满足“=”条件同时索引数量在所有条件中最少的条件将作为主查询条件进行查询。因为等于可以最快命中条件,所以优先级最高。
  2. 如果查询条件中没有“=”的条件,即全部时范围查询,分析程序会优先调用字段组索引(ColumnSet)进行查询。

ColumnSet

字段中所有组名的索引,它继承了IndexBase对象在创建组时会将组名(组名会按照索引规则拆分创建所以有顺序)插入此对象中并进行了排序,当使用范围查询条件作为主查询时,会首选在此对象里筛选出符合条件分组,再进行数据条件查询,以减少查询范围。组索引数据对象(CacheIndexCollect)也是由它创建并维护的。

CacheIndex

索引对象,用于维护一个ColumnSet提供调用分组的方法。

CacheIndexCollect

组索引数据对象,用来存储数据主索引的地方,同时此对象维护索引与原始数据存储对象(文件)的关系。

所有被插入的数据都会按照每个字段创建主索引,每个字段每一个值都有它的主索引,数据插入时会安装字段名及值来分别创建(这也是为什么说“=”可以最快命中的原因),查询时会先使用主索引找到数据,然后再去比较其他条件是否满足。

因为是所有数据的最上端,此对象二进制头部作为状态为,当设置为0时代表此对象已删除。组索引文件并不会被永远打开,为了释放资源,在所有调用都完成(调用计数器为0时),管理线程会等待一段事件,如果仍然没有调用则会关闭内存文件(但内存文件对象不会被销毁),在需要时再载入。

CacheIndexDataCheckItem

数据文件查询对象,主要目的是多线程查询情况下,减少文件反复打开关闭的过程。

CacheIndexData

索引数据检索对象,用来存储数据完整索引信息的文件,上文提到索引会首先创建一个主索引,但是插入的数据其实不止有主索引,还有其他的字段数据这些数据会被存储在此对象里,存储方式类似hashtable会在内存文件中获取指定长度的空位,计算索引值在空位中则赋值,被占用则扩表。

查询时会进行同样的计算,先从表中获取索引数据(实际数据存放位置),如果没有此索引则表示数据不符合,如果存在则使用实际数据位置获取完整原始数据进行比较(索引可能会重复所以必须比较原始数据)。它继承了IndexBase对象。

CacheData

数据存储对象,它继承了DataBase对象,用来存储实际数据,同时提供返回了一个查询结果对象。

查询结果对象,会在每次查询到正确数据并插入时回调(如果有),并将查询到的数据返回,用户可以在此回调里处理诸如聚合统计,分组等处理。

此对象仅存储了实际数据的指针位置,并不会立刻返回实际数据。需要调用方法得到。

TransactionBase

事务对象,提供有限的事务(如:插入,更新)此对象会创建一个进程在进程中调用用户方法以便隔离操作,当创建进程后所有的插入或更新会被存入缓存(仅对组操作起效),在提交前会先将所有未提交的数据写入文件,当提交发生错误时(程序检测到提交事务文件未被删除),则会在初始化时再次执行被保存的提交事务。

  • 后续改进方向
  1. 修改事务实现,将事务方法完成,提供更全面的事务
  2. 增加客户端测试程序

3、修改以便可以分布部署

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值