4
1

More than 3 years have passed since last update.

【Go言語】Go製データベースBadgerの基本的な使い方まとめ【BadgerDB】

Posted at

日本語のドキュメントを探しても見つからなかったのでメモ。

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参照)

4
1
0

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
4
1