整個代碼不是很復雜,可以從代碼中理解如何實現。
特點:btree,很小巧,但實現了完整事務機制,穩定,即使丟電也不會導致數據庫錯誤。
整個結構如下:
meta page (前兩頁) --- > freelist page (第三頁)
|
-----> bucket page (屬於leaf page 開始是第4頁) -> branch page -> leaf page
|
---------> inline page(放在bucket page上)
事務:
修改會產生鏡像頁,在寫入的時候,先寫所有鏡像頁,然后再寫指向鏡像頁的meta page,如果鏡像頁沒寫完,程序就崩潰了,不影響之前的數據,因為meta page沒有指向鏡像頁,如果meta page只寫了一半,那么可以用checkSum檢查出來,meta page雙備份。
如果事務未提交,meta page不會指向鏡像頁,也就不會讀到事務中的數據。
問題:
沒做repetable_read級別的事務實現,直接serialize級別的,不允許同時寫(但允許寫時讀),所以導致寫入慢。
默認每次寫都刷盤,大大拉低速度。這個可以調。
內存占用隨着數據變得太大,這個我覺得是代碼本身的問題,太多的東西序列化到了內存,這部分的代碼也寫得不好,太晦澀,難改。
改進的方法?:
增加一個持久層(線性寫入)和內存層(用於查詢,未寫入boltdb之前寫入內存),提升並發,然后再批量寫入boltdb。
