自己寫了一個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、修改以便可以分佈部署

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章