golang 封装leveldb
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相关推荐
- golang封装mysql涉及到的包以及sqlx和gorm的区别
一.前言 本篇是搬运之前的笔记,刚用golang的时候,看到mysql的封装部分,总是很好奇为什么会用到那么多的包,例如: "database/sql" "github. ...
- golang mysql封装_使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)
在models/baseModel 定义了 一个BaseModel对象,在这个对象上定义了 获取数据库连接和 释放数据库连接的方法 type BaseModel struct { dbConnect ...
- GoLang封装常用工具方法
码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071 最新源码:https://github.com/why444216978/go-util package uti ...
- leveldb java_LevelDB 代码撸起来!
LevelDB 的大致原理已经讲完了,本节我们要亲自使用 Java 语言第三方库 leveldbjni 来实践一下 LevelDB 的各种特性.这个库使用了 Java Native Interface ...
- Golang优秀开源项目汇总(持续更新。。。)
Golang优秀开源项目汇总(持续更新...) 我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open ...
- Go语学习笔记 - 调用ffmpeg-api实现音频重采样
目录 前言 环境部署 代码 总结 前言 最近对golang处理音视频很感兴趣,对golang音视频常用库goav进行了一番研究.自己写了一个wav转采样率的功能.给大家分享一下,中间遇到了不少坑,解决 ...
- 2021春招面经系列--计算机网络和操作系统
导读 Reactor模型Reactor详解 缓存一致性问题 缓存一致性怎么解决 网络模型 OSI七层 物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP四层 网络接口层.网际层 ...
- Hystrix php,详解 hystrix-go 使用与原理
下面由golang教程栏目给大家介绍关于golang封装一个bash函数,用于执行bash命令析,希望对需要的朋友有所帮助! 开篇 这周在看内部一个熔断限流包时,发现它是基于一个开源项目 hystri ...
- 基础知识------我所知道的、应该知道的
2020-3-24 更新: https://tonybai.com/2020/03/21/illustrated-tales-of-go-runtime-scheduler/ 这里解释了一下M阻塞时会 ...
最新文章
- 首次公开!深度学习在知识图谱构建中的应用
- 别怕,BCH无惧攻击
- 判断二叉树中两个节点的最低共同父节点
- 《构建之法》读后感5
- hdu 3449(依赖背包)
- 2014中国企业面对的五大挑战
- WPF自定义控件的三种方式
- php excel 函数,php实现excel中rank函数功能的方法
- 第十四章:求雨的法术
- 英文文本分析:与COVID-19有关的论文文本分析
- 【转】数据库范式(1NF 2NF 3NF BCNF)详解二
- Matlab plot默认常用颜色RGB及十六进制颜色代码
- 前端JS-页面延迟刷新
- 李力刚《谈判博弈》读书笔记
- 项目经理之项目经理的必备能力
- Sharestation 工作站GPU虚拟化,实现共享GPU办公
- pc端emoji表情
- 【小白破解电脑密码】忘记电脑开机密码了,怎么办?
- JavaWeb_Eclipse的使用
- windows安装nacos
热门文章
- 3.邮箱验证-jmail
- 【Pytorch深度学习实战】(7)深度残差网络(DRN)
- 什么是WAF?有什么功能?
- Exactly Once,究竟是对什么Exactly Once?
- java calendar 设置小时_Java Calendar类的时间操作
- 苹果xsmax是什么接口_质量媲美苹果官方同款,液态硅胶手机壳,拿手里太舒服了~...
- numpy学习笔记-花哨的索引
- 平面设计没有基础要学多久才能工作
- linux查找redis的配置文件
- Node.js 应用高 CPU 占用率的分析方法