Badger : key-value support


#1

這主題大概就是 golang 要用的 key-value 支援,在 nosql 中 rocksdb 就是一個非常經典的代表,底層其實是 level db,但 level db 其實和 sqlite 差不多,都是 lib 而非真正的 “server”,所以這邊說的 Badger 也相同

Golang 內要實作 rocksdb 真的太累且慢,因為當初 rocksdb 是 C base 的,強迫遷移到 Go 上整個水土不服,速度爆慢,所以 … 原生的 Badger 剛好補上這個部分就是

anyway 直接最小 example code

package main

import (
	"fmt"
	"log"
	"strconv"
	"time"

	"github.com/dgraph-io/badger"
)

var db *badger.DB

func init() {
	// dbPath will be created if it doesn't exist.
	dbPath := "./badger"
	opts := badger.DefaultOptions
	opts.Dir = dbPath
	opts.ValueDir = dbPath
	var err error
	db, err = badger.Open(opts)
	if err != nil {
		log.Fatal(err)
	}
}
func main() {
	var err error
	startAt := time.Now().Unix()
	fmt.Printf("startAt : %d \n", startAt)
	// setter
	for i := 0; i < 100000; i++ {
		strI := strconv.Itoa(i)
		err = db.Update(func(txn *badger.Txn) error {
			return txn.Set([]byte(strI), []byte(strI))
		})
		if err != nil {
			fmt.Printf("err : %s \n", err)
		}
	}
	// getter
	for i := 0; i < 100000; i++ {
		strI := strconv.Itoa(i)
		err = db.View(func(txn *badger.Txn) error {
			_, err := txn.Get([]byte(strI))
			return err
		})
	}
	endAt := time.Now().Unix()
	fmt.Printf("endAt : %d \n", endAt)
	fmt.Printf("cost : %d \n", endAt-startAt)
}

整題來說都是滿意,之後再另外發篇 … nosql 如何做"集合"的解釋就是