最近利用端午假期,我把LiteDB的源码仔细的阅读了一遍,酣畅淋漓,确实收获了不少。后面将编写一系列关于LteDB的文章分享给大家,希望这么好的源码不要被埋没。

1.LiteDB是什么

这是一个小型的.NET平台开源的NoSQL类型的轻量级文件数据库。特点是小和快,由于完全由C#'编写,所以可以支持LINQ,创建数据库是一个单一文件,类似Sqlite。

关于它的中文介绍大家可以看一下.net前辈-数据之巅的博客:https://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_LiteDB.html

中文网站:http://www.litedb.org/

主要特点有:

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的跳表索引用可视化的方式展示出来。

这是我第一次用博客的形式解析源码,如果有纰漏,还望多指正。

最新文章

  1. 使用excel结合线性规划求解Holt-Winters参数
  2. vld使用
  3. ubuntu mysql 更改IP导致mysql无法启动
  4. c/c++ 输入输出缓冲区
  5. 错误:StrictMode $ AndroidBlockGuardPolicy.onNetwork
  6. the serializable class XXX does not declare a static final seriaVersionUID...的问题
  7. Linux/Unix shell 自动发送AWR report(二)
  8. cobbler自动安装系统
  9. HDOJ-2009 求数列的和
  10. 项目笔记-vue
  11. 【从零开始自制CPU之学习篇00】开篇
  12. Mysql Navicat连接
  13. c#之枚举,结构体
  14. FILE文件删除操作(删除指定文件夹下所有文件和文件夹包括子文件夹下所有文件和文件夹),就是删除所有
  15. iOS设置图片名称、启动图片、防止TabBar图片和文字渲染
  16. Jq_javascript跨域问题
  17. DRF框架获取参数的方式
  18. Java反射API研究(1)——注解Annotation
  19. Docker中images中none的镜像删除
  20. 洛谷P2761 软件补丁问题(状压dp)

热门文章

  1. Linux运维工程师成长路线及应实现的目标
  2. Windows 64 位下安装 psyco 1.6
  3. Google+团队如何测试移动应用 - from Google Testing Blog
  4. Java的String类字符串的拆分
  5. kafka 0.11.0.3 源码编译
  6. 高并发 Nginx+Lua OpenResty系列(4)——Lua 模块开发
  7. 系统学习 Java IO (七)----字节数组流 ByteArrayInputStream/ByteArrayOutputStream
  8. Charles抓包工具_基本功能
  9. SQL Server温故系列(1):SQL 数据操作 CRUD 之增删改合
  10. centos7搭建基于SAMBA的网络存储