BoltDB是一个嵌入式key/value的数据库, 它由 B+Tree实现,etcd和consul项目都用了它,未必是因为性能有多高而是简单可靠,个人认为比较适合的场景是,用来做wal日志或者读多写少的存储场景。
BoltDB设计源于LMDB,具有以下特点:
- boltdb不是分布式数据库,它是一款单机版的数据库。
- boltdb不是sql类型的关系型数据库,它和其他的kv组件类似,对外暴露的是kv的接口。
- boltdb数据库支持两类事务:读写事务、只读事务。
调试代码
-
从 BoltDB 下载源码,解压为 bolt-mastart 目录
-
IDE 新建 blotDB-demo 工程
-
将 bolt-mastart 目录放置工程中,并在 bolt-mastart 目录内新建 go.mod 文件
module bolt go 1.17
-
在 blotDB-demo 工程中新建 go.mod 文件
module boltDB-demo go 1.16 require ( github.com/boltdb/bolt v1.3.1 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect ) replace github.com/boltdb/bolt v1.3.1 => ./bolt-master
-
main 代码:
编写简单的代码,打断点调试成功。package main import ( "fmt" "github.com/boltdb/bolt" "log" ) func main() { db, err := bolt.Open("./my.db", 0600, nil) if err != nil { panic(err) } defer db.Close() // 往db里面插入数据 err = db.Update(func(tx *bolt.Tx) error { bucket, err := tx.CreateBucketIfNotExists([]byte("testDB")) if err != nil { log.Fatalf("CreateBucketIfNotExists err:%s", err.Error()) return err } if err = bucket.Put([]byte("hello"), []byte("world")); err != nil { log.Fatalf("bucket Put err:%s", err.Error()) return err } return nil }) if err != nil { log.Fatalf("db.Update err:%s", err.Error()) } // 从db里面读取数据 err = db.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte("testDB")) val := bucket.Get([]byte("hello")) fmt.Printf("the get val: %s\n", val) return nil }) if err != nil { log.Fatalf("db.View err:%s", err.Error()) } }
输出:
image.png
网友评论