LiteDB源码解析系列(1)LiteDB介绍
最近利用端午假期,我把LiteDB的源码仔细的阅读了一遍,酣畅淋漓,确实收获了不少。后面将编写一系列关于LteDB的文章分享给大家,希望这么好的源码不要被埋没。
1.LiteDB是什么
这是一个小型的.NET平台开源的NoSQL类型的轻量级文件数据库。特点是小和快,由于完全由C#'编写,所以可以支持LINQ,创建数据库是一个单一文件,类似Sqlite。
关于它的中文介绍大家可以看一下.net前辈-数据之巅的博客:https://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_LiteDB.html
主要特点有:
1.NoSQL文件存储。这是和传统关系型数据库的主要区别;支持实体类的字段更新;
2.类似MongoDB的简单API;
3.完全使用C#代码,在.NET 4.0环境下编写,核心dll小巧,只有168K;
4.支持ACID事务处理;
5.可以进行写入失败的恢复;
6.存储到文件或者数据流中(类似MongoDB的GridFS);
7.类似Sqlite的单一文件存储;
8.支持文件索引,可以进行快速搜索;可以直接存储文件;
9.支持Linq查询;【这也许是C#编写最直接的好处】;
10.支持命令行操作数据库,官方提供了一个Shell command line;
11.完全开源和免费,包括商业使用;
我主要阅读的源码是0.0.8版本,这个版本是LiteDB最初版本。该版本虽然存在一些bug,但相对于后面的版本,该版本技术实现的很简单粗暴,入手比较快。后面分析的细节也是根据0.0.8版本进行的。
2.LiteDB源码文件结构
这里贴一张0.0.8版本的项目结构图:
Document:LiteDB序列化到硬盘使用的是一种叫Bson格式的数据,顾名思义bson类似于json只不过将数据序列化成byte数组,在Document模块中定义了Bson的类、数组、数据类型等。
Engine:这个模块里就是与用户交互最多的LiteEngine类(后面的版本改名叫LiteDatabase)和LiteCollection类,LiteEngine对用户提供了创建或打开数据库的接口,LiteCollection是用来对单张表做增删改查操作,我们看源码,可以从这两个类作为突破点。
Query:这个模块提供了数据库对于Linq的支持,用户使用lambda表达式,在这个模块中的QueryVisitor类中被解析成一系列表达式比如:and、or、between、less等等。
Serializer:这个模块就提供了对于不同类型的数据进行Bson序列化,0.0.8版本使用了fastBinaryJSON这个开源组件,后面的版本不再使用。
Shell:这个模块为数据库提供了脚本支持。
Storage:这个文件夹里包括了整个LiteDB里最核心的三个实现模块即Pages、Structures、Services。
Pages:定义了数据库页:Header Page,Collection Page,Index Page, Data Page,Extend Page。
Structures:定义了CollectionIndex(表索引)、DataBlock(数据块)、PageAddress(页地址)、IndexKey(索引键)和IndexNode(索引节点)五个数据结构。
Services:包括了数据库对缓存、硬盘读写、索引查询、数据页的增删改查操作、回滚操作等功能的实现。
Utils:这个就是一些公用的工具类和异常定义。
3.后续介绍
后面的系列我将着重讲解以下几个部分:
1.LiteDB中关于页的概念,CollectionIndex、DataBlock和IndexNode这几个数据结构的作用。
2.Query模块如何实现linq功能,顺便试着解答博主数据之巅在博客中提出的关于分页的疑问。
3.LiteDB如何使用索引查询的,对比Mysql的索引方式,将LiteDB的跳表索引用可视化的方式展示出来。
这是我第一次用博客的形式解析源码,如果有纰漏,还望多指正。
LiteDB源码解析系列(1)LiteDB介绍的更多相关文章
- LiteDB源码解析系列(4)跳表基本原理
LitDB里面索引的数据结构是用跳表来实现的,我知道的开源项目中使用跳表的还包括Redis,大家可以上网搜索关于Redis的跳表功能的实现.在这一章,我将结合LiteDB中的示例来讲解跳表. 1.跳表 ...
- LiteDB源码解析系列(2)数据库页详解
在这一篇里,我将用图文的方式展示LiteDB中页的结构及作用,内容都是原创,在描述的过程中有不准确的地方烦请指出. 1.LiteDB页的技术工作原理 LiteDB虽然是单个文件类型的数据库,但是数据库 ...
- LiteDB源码解析系列(3)索引原理详解
在这一章,我们将了解LiteDB里面几个基本数据结构包括索引结构和数据块结构,我也会试着说明前辈数据之巅在博客中遇到的问题,最后对比mysql进一步深入了解LiteDB的索引原理. 1.LiteDB的 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- TiKV 源码解析系列文章(三)Prometheus(上)
本文为 TiKV 源码解析系列的第三篇,继续为大家介绍 TiKV 依赖的周边库 rust-prometheus,本篇主要介绍基础知识以及最基本的几个指标的内部工作机制,下篇会介绍一些高级功能的实现原理 ...
- TiKV 源码解析系列 - Raft 的优化
本系列文章主要面向 TiKV 社区开发者,重点介绍 TiKV 的系统架构,源码结构,流程解析.目的是使得开发者阅读之后,能对 TiKV 项目有一个初步了解,更好的参与进入 TiKV 的开发中.本文是本 ...
- Android源码解析系列
转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...
随机推荐
- QT4与QT3的不同
1)QT4中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的工作是巨大的,这些新的控件使用了新的方法.属性 ...
- STL函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析
在C++ STL的SGI实现版本中,一级空间配置器class __malloc_alloc_template中有一个静态函数的实现如下: static void (*set_malloc_handle ...
- Spring单例模式多线程安全问题-有状态的Bean
Spring单例与线程安全小结 一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思 ...
- web的seo
摘要:搜索引擎优化是一种具有很高技术性的活动,也是一种营销功能,必须将它作为营销活动处理.SEO从业者必须理解公司的服务.产品.总体业务战略.竞争形势.品牌.未来网站开发目标和相关的业务构成. SEO ...
- 【过时】Maven简单安装与集成Eclipse
前言:MyEclipse前期产品对maven支持性不是很好,而且对maven版本要求很严格,集成后有很多问题,所以推荐 使用比较新的IDE进行开发. 1.环境搭建(只是用IDE集成的不需要系统安装,请 ...
- nginx之gzip压缩
nginx的gizp压缩 为了使网站节省带宽和加快访问速度,在服务器方面的一个优化的就是使用nginx提供的gzip压缩. 一.使用压缩原理: 1.当用户使用浏览器访问网站时,就是在发送一个http请 ...
- PATA 1065 A+B and C (64bit)
1065. A+B and C (64bit) (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HOU, Qiming G ...
- MyBatis从入门到精通(五):MyBatis 注解方式的基本用法
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. @Select 注解 1.1 使 ...
- CentOS7系统安装
CenOS7安装系统 镜像下载地址: http://isoredirect.centos.org/centos/7/isos/x86_64/ https://mirrors.aliyun.com/ce ...
- Hive入门(三)分桶
1 什么是分桶 上一篇说到了分区,分区中的数据可以被进一步拆分成桶,bucket.不同于分区对列直接进行拆分,桶往往使用列的哈希值进行数据采样.在分区数量过于庞大以至于可能导致文件系统崩溃时,建议使用 ...