https://github.com/boltdb/bolt
BoltDB 為一個單機的 key-value 數據庫,模型異常簡單且漂亮,代碼簡潔,總共代碼 (除去測試代碼) 只有6K左右。
以 Golang 編程。
核心代碼大約只有 3000 行,便於學習。
對於想學習數據庫模型的同學,強烈推薦閱讀 BoltDB 源碼,理解 BoltDB 模型,閱讀其代碼,不只是學習,也是享受。
Bolt supports fully serializable ACID transactions.
BoltDB 支持完全可序列化的 ACID 事務。
ACID,是指資料庫管理系統(DBMS)在寫入或更新資料的過程中,為保證事務(transaction)是正確可靠的,所必須具備的四個特性:原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、持久性(durability)。
在資料庫系統中,一個事務是指:由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原帳戶扣除金額,以及向目標帳戶添加金額,這兩個資料庫操作的總和,構成一個完整的邏輯過程,不可拆分。這個過程被稱為一個事務,具有 ACID 特性。
Atomicity(原子性):一個事務(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。即,事務不可分割、不可約簡。
Consistency(一致性):在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設約束、觸發器、級聯回滾等。
Isolation(隔離性):資料庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
Durability(持久性):事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。
BoltDB 的優缺點
https://zhuanlan.zhihu.com/p/47214093
BoltDB 源碼相當清晰,沒有黑魔法,就是經典的B+Tree實現,在工程中非常可控,簡單可靠。
B+Tree 天然優勢,隨機查詢比 LSM tree (Log-structured merge-tree) 快。
BoltDB 為了規避 mmap 寫入性能下降的問題,只有在讀取的時候走 mmap,寫回是在 tx.go 的func (tx *Tx) Commit() error 然後跳到 tx.db.ops.writeAt。
原理可以搜索 unified buffer cache,用 mmap 寫大文件時需要留意此問題。
如果 內存 > 數據庫 && 讀 > 寫 && 穩定 > 性能,可以考慮選擇 BoltDB。
基于 Go 的 K/V 数据库 BoltDB 簡介與使用說明
https://godoc.org/github.com/boltdb/bolt
https://studygolang.com/articles/10433
http://www.opscoder.info/boltdb_intro.html
https://zhuanlan.zhihu.com/p/27444660
https://iter01.com/442959.html