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

源码:

源码目录:

main.go:

package mainimport ("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 databasetype Database interface {Close()Put(key []byte, value []byte) errorGet(key []byte) ([]byte, error)GetString(key string) (string, error)PutString(key string, value string) errorHas(key []byte) (ret bool, err error)HasString(key string) (ret bool, err error)Delete(key []byte) errorDeleteSring(key string) errorNewBatch() Batch
}type Batch interface {Put(key []byte, value []byte)Delete(key []byte)Commit() errorRollback()
}

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

package leveldbimport ("github.com/syndtr/goleveldb/leveldb"
)type Batch struct {leveldb *leveldb.DBbatch   *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 leveldbimport ("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.DBquitChan 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#

golang 封装leveldb相关推荐

  1. golang封装mysql涉及到的包以及sqlx和gorm的区别

    一.前言 本篇是搬运之前的笔记,刚用golang的时候,看到mysql的封装部分,总是很好奇为什么会用到那么多的包,例如: "database/sql" "github. ...

  2. golang mysql封装_使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)

    在models/baseModel 定义了 一个BaseModel对象,在这个对象上定义了 获取数据库连接和 释放数据库连接的方法 type BaseModel struct { dbConnect ...

  3. GoLang封装常用工具方法

    码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071 最新源码:https://github.com/why444216978/go-util package uti ...

  4. leveldb java_LevelDB 代码撸起来!

    LevelDB 的大致原理已经讲完了,本节我们要亲自使用 Java 语言第三方库 leveldbjni 来实践一下 LevelDB 的各种特性.这个库使用了 Java Native Interface ...

  5. Golang优秀开源项目汇总(持续更新。。。)

    Golang优秀开源项目汇总(持续更新...) 我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open ...

  6. Go语学习笔记 - 调用ffmpeg-api实现音频重采样

    目录 前言 环境部署 代码 总结 前言 最近对golang处理音视频很感兴趣,对golang音视频常用库goav进行了一番研究.自己写了一个wav转采样率的功能.给大家分享一下,中间遇到了不少坑,解决 ...

  7. 2021春招面经系列--计算机网络和操作系统

    导读 Reactor模型Reactor详解 缓存一致性问题 缓存一致性怎么解决 网络模型 OSI七层 物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP四层 网络接口层.网际层 ...

  8. Hystrix php,详解 hystrix-go 使用与原理

    下面由golang教程栏目给大家介绍关于golang封装一个bash函数,用于执行bash命令析,希望对需要的朋友有所帮助! 开篇 这周在看内部一个熔断限流包时,发现它是基于一个开源项目 hystri ...

  9. 基础知识------我所知道的、应该知道的

    2020-3-24 更新: https://tonybai.com/2020/03/21/illustrated-tales-of-go-runtime-scheduler/ 这里解释了一下M阻塞时会 ...

最新文章

  1. 首次公开!深度学习在知识图谱构建中的应用
  2. 别怕,BCH无惧攻击
  3. 判断二叉树中两个节点的最低共同父节点
  4. 《构建之法》读后感5
  5. hdu 3449(依赖背包)
  6. 2014中国企业面对的五大挑战
  7. WPF自定义控件的三种方式
  8. php excel 函数,php实现excel中rank函数功能的方法
  9. 第十四章:求雨的法术
  10. 英文文本分析:与COVID-19有关的论文文本分析
  11. 【转】数据库范式(1NF 2NF 3NF BCNF)详解二
  12. Matlab plot默认常用颜色RGB及十六进制颜色代码
  13. 前端JS-页面延迟刷新
  14. 李力刚《谈判博弈》读书笔记
  15. 项目经理之项目经理的必备能力
  16. Sharestation 工作站GPU虚拟化,实现共享GPU办公
  17. pc端emoji表情
  18. 【小白破解电脑密码】忘记电脑开机密码了,怎么办?
  19. JavaWeb_Eclipse的使用
  20. windows安装nacos

热门文章

  1. 3.邮箱验证-jmail
  2. 【Pytorch深度学习实战】(7)深度残差网络(DRN)
  3. 什么是WAF?有什么功能?
  4. Exactly Once,究竟是对什么Exactly Once?
  5. java calendar 设置小时_Java Calendar类的时间操作
  6. 苹果xsmax是什么接口_质量媲美苹果官方同款,液态硅胶手机壳,拿手里太舒服了~...
  7. numpy学习笔记-花哨的索引
  8. 平面设计没有基础要学多久才能工作
  9. linux查找redis的配置文件
  10. Node.js 应用高 CPU 占用率的分析方法