Bolt是一个纯粹Key/Value模型的程序。该项目的目标是为不须要完整数据库服务器(如Postgres或MySQL)的项目提供一个简单,快速,可靠的数据库。html
BoltDB只须要将其连接到你的应用程序代码中便可使用BoltDB提供的API来高效的存取数据。并且BoltDB支持彻底可序列化的ACID事务,让应用程序能够更简单的处理复杂操做。git
其源码地址为:https://github.com/boltdb/boltgithub
BoltDB设计源于LMDB,具备如下特色:数据库
使用Go语言编写windows
不须要服务器便可运行数组
支持数据结构服务器
直接使用API存取数据,没有查询语句;数据结构
支持彻底可序列化的ACID事务,这个特性比LevelDB强;并发
数据保存在内存映射的文件里。没有wal、线程压缩和垃圾回收;工具
经过COW技术,可实现无锁的读写并发,可是没法实现无锁的写写并发,这就注定了读性能超高,但写性能通常,适合与读多写少的场景。
BoltDB是一个Key/Value(键/值)存储,这意味着没有像SQL RDBMS(MySQL,PostgreSQL等)中的表,没有行,没有列。相反,数据做为键值对存储(如在Golang Maps中)。键值对存储在Buckets中,它们旨在对类似的对进行分组(这与RDBMS中的表相似)。所以,为了得到Value(值),须要知道该Value所在的桶和钥匙。
Linux中:
$ go get github.com/boltdb/bolt/...
Windows中:
1.前提是已经安装GO语言环境.
2.安装git for windows :
http://git-for-windows.github.io/
3.安装Git后才能执行命令:
go get github.com/boltdb/bolt/...
来安装第三方包。这条命令它会把 类库包源代码,下载解压到你的 %GOPATH% 路径里面去,好比:C:\go\gopath\ src\github.com\...
前面是gopath路径,后面是类库,而且它还会同时执行 go install xxx ,生成 D:\go\gopath\pkg\xxxx 这样的包路径。
注意:
【在GoLand开发工具中,是能够直接获取GitHub中的源代码的,该方法更便捷!】
4. 在代码中导入第三方包:
import ( "github.com/boltdb/bolt" // 从环境变量:%goPath% 中定义的路径去查找第三方类库 )
//1.数据库建立 //在这里gland直接运行,生成的my.db在main.go上层目录;命令行build在运行的话是当前目录!!! db, err := bolt.Open("chaorsBlock.db", 0600, nil) if err != nil { log.Fatal(err) } defer db.Close()
注意:
若是经过goland程序运行建立的my.db会保存在$GOPATH /src/Project目录下
若是经过go build main.go ; ./main 执行生成的my.db,会保存在当前目录$GOPATH /src/Project/package下
//2.建立表 err = db.Update(func(tx *bolt.Tx) error { //判断要建立的表是否存在 b := tx.Bucket([]byte("MyBlocks")) if b == nil { //建立叫"MyBucket"的表 _, err := tx.CreateBucket([]byte("MyBlocks")) if err != nil { //也能够在这里对表作插入操做 log.Fatal(err) } } //必定要返回nil return nil }) //更新数据库失败 if err != nil { log.Fatal(err) }
//3.更新表数据 err = db.Update(func(tx *bolt.Tx) error { //取出叫"MyBucket"的表 b := tx.Bucket([]byte("MyBlocks")) //往表里面存储数据 if b != nil { //插入的键值对数据类型必须是字节数组 err := b.Put([]byte("l"), []byte("0x0000")) err := b.Put([]byte("ll"), []byte("0x0001")) err := b.Put([]byte("lll"), []byte("0x0002")) if err != nil { log.Fatal(err) } } //必定要返回nil return nil }) //更新数据库失败 if err != nil { log.Fatal(err) }
//4.查看表数据 err = db.View(func(tx *bolt.Tx) error { //取出叫"MyBucket"的表 b := tx.Bucket([]byte("MyBlocks")) //往表里面存储数据 if b != nil { data := b.Get([]byte("l")) fmt.Printf("%s\n", data) data := b.Get([]byte("l")) fmt.Printf("%s\n", data) } //必定要返回nil return nil }) //查询数据库失败 if err != nil { log.Fatal(err) }