LoginSignup
58

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-08-23

概要

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
58