概要
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版がアップされました。