Edited at

importするだけで使えるgolang製kvsのboltdb

More than 5 years have passed since last update.


概要

golang製kvsのboltdbの紹介です。

LMDBのgolang portです。(完全に同じではありません)


boltdbとは


  • 別プロセスを立てること無くgolangのプログラムからImportするだけで使えるkvsです。


    • kvsなのでRDBが必要な場合はsqliteのamalgation code等を使うと良いと思います。

    • 単一プロセス内に閉じるシンプルな構造のため、レプリケーション/シャーディング等は機能としてはサポートされていません。



  • ACID/MVCCをサポートします。

  • トランザクション


    • writeとreadのトランザクションが別物でreadとwriteは相互にブロックすることはありません。

    • readは並列実行可能かつ非常に高速です。

    • writeは常に直列化されるため、デッドロックが起こり得ません。

    • 各goroutineでトランザクションを生成する限りスレッドセーフです。(トランザクション自体を複数のgoroutineで共有するのはNG)



  • まだベータ版です。


使い方


get & import

go get github.com/boltdb/bolt

import "github.com/boltdb/bolt"


open db

    db, err := bolt.Open("/path/to/datafile", 0600, nil)

if err != nil {
log.Fatal(err)
}
defer db.Close()

Openの第一引数はデータ書き込み先のファイルです。

存在しない場合は作成されます。

複数のプログラムからの書き込みはできません。


write transaction

    db.Update(func(tx *bolt.Tx) error {

bucket, err := tx.CreateBucketIfNotExists([]byte("my_bucket"))
if err != nil {
log.Fatal(err)
}
err = bucket.Put([]byte("key"), []byte("value"))
if err != nil {
log.Fatal(err)
}
return nil
})


read transaction

    err = db.View(func(tx *bolt.Tx) error {

bucket := tx.Bucket([]byte("my_bucket"))
if bucket == nil {
log.Fatal("bucket not found")
}
value := bucket.Get([]byte("key"))
fmt.Println(string(value))
return nil
})

シンプルな使い方はこんなところです。

Iterationやrange scan、BackUp等もできますので公式ページを見てもらえればと思います。


追記

こちらにleveldb版がアップされました。