golang 封装leveldb

leveldb是key-value类型的数据库,与redis,mongodb同为nosql数据库类型。
多用于比特币、以太坊、iot等场景。 数据库如果遭到破坏,可以根据日志进行修复。

源码:

源码目录:
在这里插入图片描述
main.go:

package main

import (
	"fmt"
	"tt/database/leveldb"
)

func main() {
	fmt.Println("vim-go")
	defer func() {
		if r := recover(); r != nil {
			fmt.Printf("捕获到运行时错误:%s\n", r)
		}
	}()

	db, err := leveldb.NewLevelDB("./data_dir")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	pd := func(key string) {
		val, err := db.GetString(key)
		if err != nil {
			panic(err)
		}
		fmt.Println(val)
	}

	key := "key-TangYiMo"
	err = db.PutString(key, "henan come on, zhengzhou come on")
	if err != nil {
		panic(err)
	}
	pd(key)

	if f, err := db.HasString(key); err == nil && f {
		fmt.Println("leveldb has value of key:", key)
	}
	db.DeleteSring(key)
	if f, err := db.HasString(key); err == nil && f {
		fmt.Println("leveldb has value of key:", key)
	}

	// 批量提交
	patch := db.NewBatch()
	patch.Put([]byte(key), []byte{'h', 'e', 'l', 'l', 'o'})
	//patch.Rollback()
	patch.Commit()
	fmt.Println("leveldb has value of key:", key)

	pd(key)
}


db接口 database/database.go:

package database

type Database interface {
	Close()
	Put(key []byte, value []byte) error
	Get(key []byte) ([]byte, error)
	GetString(key string) (string, error)
	PutString(key string, value string) error
	Has(key []byte) (ret bool, err error)
	HasString(key string) (ret bool, err error)
	Delete(key []byte) error
	DeleteSring(key string) error
	NewBatch() Batch
}

type Batch interface {
	Put(key []byte, value []byte)
	Delete(key []byte)
	Commit() error
	Rollback()
}

事务和回滚 database/leveldb/batch.go:

package leveldb

import (
	"github.com/syndtr/goleveldb/leveldb"
)

type Batch struct {
	leveldb *leveldb.DB
	batch   *leveldb.Batch
}

func (b *Batch) Put(key []byte, value []byte) {
	b.batch.Put(key, value)
}

func (b *Batch) Delete(key []byte) {
	b.batch.Delete(key)
}

func (b *Batch) Commit() error {
	return b.leveldb.Write(b.batch, nil)
}

func (b *Batch) Rollback() {
	b.batch.Reset()
}

leveldb api封装database/leveldb/leveldb.go:

package leveldb

import (
	"tt/database"

	"github.com/syndtr/goleveldb/leveldb"
	"github.com/syndtr/goleveldb/leveldb/errors"
)

var (
	ErrEmptyKey = errors.New("key could not be empty")
)

type LevelDB struct {
	db       *leveldb.DB
	quitChan chan struct{}
}

func NewLevelDB(path string) (database.Database, error) {
	db, err := leveldb.OpenFile(path, nil)

	if _, corrupted := err.(*errors.ErrCorrupted); corrupted {
		db, err = leveldb.RecoverFile(path, nil)
	}

	if err != nil {
		return nil, err
	}

	result := &LevelDB{
		db:       db,
		quitChan: make(chan struct{}),
	}

	return result, nil
}

func (db *LevelDB) Close() {
	close(db.quitChan)
	db.db.Close()
}

func (db *LevelDB) GetString(key string) (string, error) {
	value, err := db.Get([]byte(key))

	return string(value), err
}

func (db *LevelDB) Get(key []byte) ([]byte, error) {
	return db.db.Get(key, nil)
}

func (db *LevelDB) Put(key []byte, value []byte) error {
	if len(key) < 1 {
		return ErrEmptyKey
	}

	return db.db.Put(key, value, nil)
}

func (db *LevelDB) PutString(key string, value string) error {
	return db.Put([]byte(key), []byte(value))
}

func (db *LevelDB) Has(key []byte) (ret bool, err error) {
	return db.db.Has(key, nil)
}

func (db *LevelDB) HasString(key string) (ret bool, err error) {
	return db.Has([]byte(key))
}

func (db *LevelDB) Delete(key []byte) error {
	return db.db.Delete(key, nil)
}

func (db *LevelDB) DeleteSring(key string) error {
	return db.Delete([]byte(key))
}

func (db *LevelDB) NewBatch() database.Batch {
	batch := &Batch{
		leveldb: db.db,
		batch:   new(leveldb.Batch),
	}
	return batch
}

执行:

root@jack-VirtualBox:~/test/leveldb# go mod init tt
root@jack-VirtualBox:~/test/leveldb# go mod tidy
root@jack-VirtualBox:~/test/leveldb# ./tt 
vim-go
henan come on, zhengzhou come on
leveldb has value of key: key-TangYiMo
leveldb has value of key: key-TangYiMo
hello
root@jack-VirtualBox:~/test/leveldb#
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐墨123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值