日本語のドキュメントを探しても見つからなかったのでメモ。
Badgerとは
- BadgerDBは、純粋なGoで記述された埋め込み可能な永続的で高速なKey-Value(KV)データベースです。
- Github: https://github.com/dgraph-io/badger
環境(執筆時点)
- Go: 1.14.2
- Badger: 2.0.3
インストール
$ go get github.com/dgraph-io/badger/v2
サンプルコード
db.View() は読み取り専用トランザクションです。このメソッド内で更新処理は行なえません。
package main
import (
"fmt"
"log"
badger "github.com/dgraph-io/badger/v2"
)
func handle(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
// オプションを作成
opt := badger.DefaultOptions("./foo/bar")
// DBに接続
db, err := badger.Open(opt)
handle(err)
// 最後にDBから切断
defer db.Close()
// 読み書きトランザクション
err = db.Update(func(txn *badger.Txn) error {
err = txn.SetEntry(badger.NewEntry([]byte("apple"), []byte("140")))
err = txn.SetEntry(badger.NewEntry([]byte("melon"), []byte("320")))
err = txn.SetEntry(badger.NewEntry([]byte("lemon"), []byte("230")))
return err
})
handle(err)
// 読み取り専用トランザクション
err = db.View(func(txn *badger.Txn) error {
// 全てのキーと値をループ
opts := badger.DefaultIteratorOptions
it := txn.NewIterator(opts)
defer it.Close()
for it.Rewind(); it.Valid(); it.Next() {
item := it.Item()
k := item.Key()
err := item.Value(func(v []byte) error {
fmt.Printf("key=%s, value=%s\n", k, v)
return nil
})
if err != nil {
return err
}
}
// キーを指定して取得
item, err := txn.Get([]byte("apple"))
handle(err)
err = item.Value(func(val []byte) error {
fmt.Printf("apple: %s\n", val)
return nil
})
handle(err)
return nil
})
handle(err)
}
出力結果は以下の通り
key=apple, value=140
key=lemon, value=230
key=melon, value=320
apple: 140
オプション
インメモリにする場合は以下の通り
opt := badger.DefaultOptions("").WithInMemory(true)
ログ出力をオフにする場合は以下の通り
opt.Logger = nil
その他
BadgerはLSM-Treeとは別に値を保持する関係上、定期的にGCを実行する必要があるようです。
(https://github.com/dgraph-io/badger#garbage-collection)
まとめ
Badgerは記述がシンプルなためプロジェクトにも簡単に組み込めそうです。
デフォルトの設定でも高速ですがチューニング次第でさらに高速に稼働できそうです。
他にもキーのプレフィックス検索やキーのみのループ処理など便利な機能があるようです。(README参照)