LiteDB源碼解析系列(1)LiteDB介紹


最近利用端午假期,我把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的跳表索引用可視化的方式展示出來。

這是我第一次用博客的形式解析源碼,如果有紕漏,還望多指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM