mydb

package module
v0.0.0-...-fd7e126 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 8, 2022 License: MIT Imports: 12 Imported by: 0

README

mydb

mydb是一个golang写的键值存储引擎,基于b+树,mmap

怎样使用:
package main

import (
	"fmt"
	"strconv"

	"github.com/alberliu/mydb"
)

func toBytes(i int) []byte {
	return []byte(strconv.Itoa(i))
}

func main() {
	db, err := mydb.Open("data")
	if err != nil {
		panic(err)
	}

	fmt.Println("init: ", db.Range(mydb.Infinity, mydb.Infinity))

	for i := 1; i <= 5; i++ {
		_, _ = db.Set(toBytes(i), toBytes(i))
	}
	fmt.Println("set:  ", db.Range(mydb.Infinity, mydb.Infinity))

	_ = db.Delete(toBytes(1))
	fmt.Println("delete", db.Range(mydb.Infinity, mydb.Infinity))

	fmt.Println("range ", db.Range(toBytes(3), toBytes(4)))
}
简单性能测试

测试环境:

goos: darwin
goarch: amd64
pkg: github.com/alberliu/mydb
cpu: Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz
插入100万数据

测试代码:

func Test_tree_get_init_data(t *testing.T) {
	tree := newDefaultTree()
	now := time.Now()
	for i := 1; i <= 1000000; i++ {
		if i%100000 == 0 {
			t.Log(i)
		}

		data := []byte(strconv.Itoa(i))
		tree.set(data, data)
	}

	t.Logf("cost:%v tps:%v", time.Now().Sub(now), 1000000/time.Now().Sub(now).Seconds())
	t.Log(tree.fm.statisticsPage())
}

测试结果:

=== RUN   Test_tree_get_init_data
    tree_test.go:296: 100000
    tree_test.go:296: 200000
    tree_test.go:296: 300000
    tree_test.go:296: 400000
    tree_test.go:296: 500000
    tree_test.go:296: 600000
    tree_test.go:296: 700000
    tree_test.go:296: 800000
    tree_test.go:296: 900000
    tree_test.go:296: 1000000
    tree_test.go:303: cost:28.372586518s tps:35245.288388313376
    tree_test.go:304: fileSize:44253184B, totalPageNum:10804, branchPageNum:126, leafPageNum:10677, recyclePageNum:0, depth:3, recordNum:1000000
--- PASS: Test_tree_get_init_data (28.72s)
100万数据下的随机查询

测试代码:

func Benchmark_tree_get(b *testing.B) {
	fm, err := newFileManager("data.txt", defaultPageSize)
	if err != nil {
		panic(err)
	}
	tree := newTree(fm)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		tree.get([]byte(strconv.Itoa(rand.Intn(1000000))))
	}
}

测试结果:

Benchmark_tree_get
Benchmark_tree_get-6   	   49418	     23364 ns/op

总结:在以上描述的场景下,写入性能35245次每秒,查询性能42800次每秒

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrRecordTooLarge = errors.New("error key value too large")
	ErrRecordNotExist = errors.New("error record not exist")
)
View Source
var Infinity = []byte("")

Functions

func Open

func Open(fileName string, opts ...Option) (*myDB, error)

Types

type Option

type Option interface {
	// contains filtered or unexported methods
}

func WithPageSize

func WithPageSize(pageSize uint64) Option

WithPageSize 设置页大小,默认值是4K

type Queue

type Queue[T any] struct {
	// contains filtered or unexported fields
}

func NewQueue

func NewQueue[T any]() *Queue[T]

func (*Queue[T]) Pop

func (r *Queue[T]) Pop() *T

func (*Queue[T]) Push

func (r *Queue[T]) Push(t *T)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL