介紹BoltDB Golang高效能持久化解決方案

2021-10-07 09:26:03 字數 2654 閱讀 2308

boltdb是純go語言實現的持久化解決方案,儲存資料至記憶體對映檔案。稱之為持久化解決方案不是資料庫,因為資料庫這個詞有很多額外功能是bolt所不具備的。正是因為缺乏這些功能使得bolt如此優雅、好用。

bolt就是乙個go包。無需在系統中安裝,開始編碼前也無需配置,什麼都不需要,僅需要go get github.com/boltdb/bolt,然後import 「github.com/boltdb/bolt」

要完全使用bolt的儲存功能,只需要乙個檔名。無論從開發者或使用者視角都感覺不可思議。不知你的感想如何,在我的工作經歷中花過很多時間搭建資料庫環境,除錯配置問題,使用者和許可權以及其他各種問題,如關係型資料庫postgresql、oracle和nosql。這些bolt都不需要,沒有使用者、無需安裝,僅乙個檔名。這對應用程式的使用者來說也是一種恩惠,因為他們也不必為那些麻煩問題而瞎折騰。

bolt不是關係型資料庫。甚至不儲存文件,雖然你可以按照這種方式使用它。其僅僅儲存鍵值對…但是如果你不知道這是什麼意思或者不知道你如何使用它進行儲存,也不用擔心。它超級簡單,而且非常靈活,讓我們來看看。

bolt儲存是分組為桶,桶是一組鍵值對集合的名稱,就像go中的map。桶的名稱、鍵以及值都是byte型別。桶可以包括其他桶,也可以通過byte型別名稱作為key。

…就是這樣。不,真的,就這樣。bolt基本上是一組巢狀對映。這種簡單性使得它易於使用。不需要設定表、模式、複雜的查詢語言。讓我們看看乙個bolt入門示例:

}輸出:hello world!

我想你正在思索————這**似乎有點長。但請記住,我完全處理了所有錯誤,至少是半正確的方式,我們正在做的所有這些:

建立資料庫

建立結構(greeting分組)

儲存資料到結構中

從結構中獲取資料

不算太壞,加上空行也不過54行**。下面詳細解釋下上面示例具體實現內容。

首先bolt.open連線資料庫,如果需要建立檔案或開啟已存在的檔案。

所有bolt讀寫操作都必須在事務內進行。在唯讀事務中同時可以有很多讀操作,但寫操作一次只能有乙個(當寫入器寫入時,讀取器維護資料庫的一致檢視)。

剛開始呼叫db.update,帶有乙個函式作為引數,函式自身的引數為bolt.tx ————bolt的事務物件。然後建立桶(bolt所有資料都用桶組織),接著增加鍵值對。寫事務完成後開始讀操作————使用db.view事務獲取剛寫入的資料。

bolt事務機制的強大之處在於它超級簡單——函式作用域就是事務的範圍。如果函式傳入update並返回nil,事務中所有更新操作是原子的存入庫中。如果函式返回錯誤則事務回滾。這使得bolt事務對go開發者來說非常簡單。只要像平時一樣返回乙個錯誤,就可以提前退出函式,bolt也做了正確的事情。無需擔心手動回滾更新或其他事情,只需返回乙個錯誤。

你可能需要另乙個基本操作是遍歷桶中的鍵/值對,在這種情況下,只需呼叫bucket.cursor(),它返回乙個游標值,它有next()、prev()等函式,它們返回鍵/值對,並像您預期的那樣工作。

bolt api還有很多內容,但剩下的大部分內容都是關於資料庫統計和一些更高階使用場景內容……但要開始在bolt資料庫中儲存資料,上述內容就是你真正需要知道的。

對於更複雜的應用程式,僅在資料庫中儲存字串可能不夠,但這沒關係,go的編碼相關包可以幫忙。你可以很容易地使用encoding/json或encoding/gob將結構序列化到資料庫中,以唯一的名稱或id作為鍵。再者bolt的好處是較低的使用門檻,不需要找出整個資料庫模式或安裝任何東西,就可以以高效能、可管理的方式將資料儲存至磁碟。

bolt的主要缺點是沒有查詢。你不能要求:給我所有以bar開頭foo物件。您可以在資料庫中建立自己的索引,並手動保持其更新。這很簡單,只需為特定查詢將ids切片(slice)序列化到「indices」桶中即可。顯然這是開始開發自己關聯式資料庫的領域,但是如果你不打算做得太過火,那麼所有這些**就夠了。那些外部dsl中的查詢只是為記憶體中資料儲存編寫的**。

bolt並非適用於所有應用。你必須了解應用程式的需求,以及bolt的鍵/值樣式是否足以滿足這些需求。如果是這樣,我想你會非常樂意使用簡單的資料儲存系統,而無需太多的腦力開銷。

高通linux 匯流排介紹

i2c 概述驅動 drivers i2c 高通平台的i2c drivers i2c busses i2c msm v2.c 分析本產品用到i2c的地方有 camera。以camera的i2c為例 裝置樹內容內容 i2c 3 i2c 78b7000 根據核心配置檔案和compatible qcom,i...

RabbitMQ高可用集群介紹

主備模式 用來實現rabbitmq的高可用集群,一般是在併發和資料不是特別多的時候使用,當主節點掛掉以後會從備份節點中選擇乙個節點出來作為主節點對外提供服務。遠端模式 主要用來實現雙活,簡稱為shovel模式,所謂的shovel模式就是讓我們可以把訊息複製到不同的資料中心,讓兩個跨地域的集群互聯。映...

Oracle的高水位線介紹

在oracle資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在oracle中,這條線被稱為高水位線 high warter mark,hwm 在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說hwm為最低值。當插入了資...