简介
nutsdb
是一个完全由 Go 编写的简单、快速、可嵌入的持久化存储。nutsdb
与我们之前介绍过的buntdb
有些类似,但是支持List
、Set
、Sorted Set
这些数据结构。
快速使用
先安装:
$ go get github.com/xujiajun/nutsdb
后使用:
package main
import (
"fmt"
"log"
"github.com/xujiajun/nutsdb"
)
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nutsdb"
db, err := nutsdb.Open(opt)
if err != nil {
log.Fatal(err)
}
defer db.Close()
err = db.Update(func(tx *nutsdb.Tx) error {
key := []byte("name")
val := []byte("dj")
if err := tx.Put("", key, val, 0); err != nil {
return err
}
return nil
})
if err != nil {
log.Fatal(err)
}
err = db.View(func(tx *nutsdb.Tx) error {
key := []byte("name")
if e, err := tx.Get("", key); err != nil {
return err
} else {
fmt.Println(string(e.Value))
}
return nil
})
if err != nil {
log.Fatal(err)
}
}
看过前面介绍buntdb
文章的小伙伴会发现,nutsdb
的简单使用与buntdb
非常相似。首先打开数据库nutsdb.Open()
,通过选项指定数据库文件存放目录。数据的插入、修改和查找都是包装在一个事务方法中执行的。nutsdb
允许同时存在多个读事务。但是有写事务存在时,其他事务不能并发执行。需要修改数据的操作在db.Update()
的回调中执行,无副作用的操作在db.View()
的回调中执行。上面代码先插入一个键值对,然后读取这个键。
从代码我们可以看出,由于涉及数据库操作,需要大量的错误处理。为了简洁起见,本文后面的代码省略了错误处理,在实际使用中必须加上!
特性
桶
**桶(bucket
)**有点像命名空间的概念。在同一个桶中的键不能重复,不同的桶可以包含相同的键。nutsdb
提供的更新和查询接口都需要传入桶名,只是我们在最开始的例子中将桶名设置为空字符串了。
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nutsdb"
db, _ := nutsdb.Open(opt)
defer db.Close()
key := []byte("name")
val := []byte("dj")
db.Update(func(tx *nutsdb.Tx) error {
tx.Put("bucket1", key, val, 0)
return nil
})
db.Update(func(tx *nutsdb.Tx) error {
tx.Put("bucket2", key, val, 0)
return nil