golang 嵌入式数据库 LevelDB

1,432 阅读1分钟

LevelDB

LevelDB是一个键值对的嵌入式数据库,拥有非常高的性能。

嵌入式数据库就是我们不需要安装,该数据库软件直接打包在我们的应用中。

package main

import (
	"fmt"
	"time"

	"github.com/syndtr/goleveldb/leveldb"
	dbUtil "github.com/syndtr/goleveldb/leveldb/util"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
	Addr string `json:addr`
}

func main() {
	// 打开数据库
	db, err := leveldb.OpenFile("./datadb.db", nil)
	if err != nil {
		fmt.Println("创建数据库失败:", err)
		return
	}
	defer db.Close()
	t := time.Now()
	for i := 0; i < 10_0000; i++ {
		key := fmt.Sprintf("key-%d", i)
		value := fmt.Sprintf("value-%d", i)
		//写入数据
		db.Put([]byte(key), []byte(value), nil)

	}
	t1 := time.Now()
	fmt.Println("write 10_0000 data used ", t1.UnixMilli()-t.UnixMilli(), "ms")
	for i := 0; i < 10_0000; i++ {
		key := fmt.Sprintf("key-%d", i)
		//读取数据
		_, err := db.Get([]byte(key), nil)
		if err != nil {
			fmt.Println("read error:", key)
		}

	}
	t2 := time.Now()
	fmt.Println("read 10_0000 data used ", t2.UnixMilli()-t1.UnixMilli(), "ms")

	// 遍历数据库
	iter := db.NewIterator(nil, nil)
	for iter.Next() {
		key := iter.Key()
		value := iter.Value()
		_ = len(key) + len(value)
	}
	t3 := time.Now()
	fmt.Println("iterator 10_0000 data used ", t3.UnixMilli()-t2.UnixMilli(), "ms")

	// 遍历数据库
	iter = db.NewIterator(dbUtil.BytesPrefix([]byte("key-1")), nil)
	for iter.Next() {
		key := iter.Key()
		value := iter.Value()
		_ = len(key) + len(value)
	}
	t4 := time.Now()
	fmt.Println("iterator 10000 data used ", t4.UnixMilli()-t3.UnixMilli(), "ms")

	// 读取最后一个
	// iter.last()

	// 删除
	// err := db.Delete([]byte("user-10000"), nil)
}

/*
write 10_0000 data used  245 ms
read 10_0000 data used  48 ms
iterator 10_0000 data used  4 ms
iterator 10000 data used  1 ms
*/