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 ...
随机推荐
- 开启Qt Lite Project
发布: http://blog.qt.io/blog/2017/01/23/qt-5-8-released/ 说法一:Qt Lite” is not a tool, but a concept tha ...
- 该内存不能read 或written数值 叙述(居然还有具体的讲究)
该内存不能read 或written数值 叙述 0 0x0000 作业完成. 1 0x0001 不正确的函数. 2 0x0002 系统找不到指定的档案. 3 0x0003 系统找不到指定的路径. 4 ...
- 命令行版扫雷(vc08)
复制代码模拟鼠标各种按键 左键 翻开右键 标雷左右键 翻开周围 先判断当前点是否为已翻开的点 时间地雷计数器清屏 展开 大于8时不管 小于等于8时翻开本身 为0时翻开周围的输出 同雷数图雷区判断 判断 ...
- jmeter报告分析工具
一直以来做性能测试都是用jmeter和LR,当然还有一些自己写测试脚本,LR不用说,分析结果那个组件杠杠的!但是jmeter毕竟是开源的,所以分析查看结果不像LR那样自带图形神马的,虽然可以自己写脚本 ...
- ngnix 安装
1安装PCRE库 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包: ...
- Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决
Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException : SQLSTATE[42000]: ...
- 如何使用VS Code编写Spring Boot (第二弹)
本篇文章是续<如何使用VS Code编写Spring Boot> 之后,结合自己.net经验捣鼓的小demo,一个简单的CRUD,对于习惯了VS操作模式的.net人员非常方便,强大的智能提 ...
- 你竟然没用 Maven 构建项目?
一年前,当我和小伙伴小龙一起做一个外包项目的时候,受到了严重的鄙视.我那时候还不知道 Maven,所以搭建项目用的还是最原始的方式,小龙不得已在导入项目的时候花了很长时间去下载项目依赖的开源类库. 出 ...
- 【docker学习二】CentOS7.5+Docker 镜像(容器)的使用
承接上篇:https://mp.csdn.net/postedit/82744127 上文介绍了容器与镜像的基本操作,这里总结下容器的使用. 先在官网找到一个镜像: https://hub.docke ...
- Codeforces Round #563 (Div. 2)C
C. Ehab and a Special Coloring Problem 题目链接:http://codeforces.com/contest/1174/problem/C 题目 You're g ...