简介
nutsdbnutsdbbuntdbListSetSorted 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)
}
}
buntdbnutsdbbuntdbnutsdb.Open()nutsdbdb.Update()db.View()
从代码我们可以看出,由于涉及数据库操作,需要大量的错误处理。为了简洁起见,本文后面的代码省略了错误处理,在实际使用中必须加上!
特性
桶
bucketnutsdb
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
})
db.View(func(tx *nutsdb.Tx) error {
e, _ := tx.Get("bucket1", key)
fmt.Println("val1:", string(e.Value))
e, _ = tx.Get("bucket2", key)
fmt.Println("val2:", string(e.Value))
return nil
})
}
运行:
val1: dj
val2: dj
select db
更新和删除
tx.Put()tx.Put()tx.Delete()
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("", key, val, 0)
return nil
})
db.View(func(tx *nutsdb.Tx) error {
e, _ := tx.Get("", key)
fmt.Println(string(e.Value))
return nil
})
db.Update(func(tx *nutsdb.Tx) error {
tx.Delete("", key)
return nil
})
db.View(func(tx *nutsdb.Tx) error {
e, err := tx.Get("", key)
if err != nil {
log.Fatal(err)
} else {
fmt.Println(string(e.Value))
}
return nil
})
}
Get()err
dj
2020/04/27 22:28:19 key not found in the bucket
exit status 1
过期
nutsdbPut()
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("", key, val, 10)
return nil
})
db.View(func(tx *nutsdb.Tx) error {
e, _ := tx.Get("", key)
fmt.Println(string(e.Value))
return nil
})
time.Sleep(10 * time.Second)
db.View(func(tx *nutsdb.Tx) error {
e, err := tx.Get("", key)
if err != nil {
log.Fatal(err)
} else {
fmt.Println(string(e.Value))
}
return nil
})
}
err
dj
2020/04/27 22:31:16 key not found in the bucket
exit status 1
遍历
nutsdb
前缀遍历
PrefixScan()nutsdbuser_
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nutsdb"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "user_list"
prefix := "user_"
db.Update(func(tx *nutsdb.Tx) error {
for i := 1; i <= 300; i++ {
key := []byte(prefix + strconv.FormatInt(int64(i), 10))
val := []byte("dj" + strconv.FormatInt(int64(i), 10))
tx.Put(bucket, key, val, 0)
}
return nil
})
db.View(func(tx *nutsdb.Tx) error {
entries, _, _ := tx.PrefixScan(bucket, []byte(prefix), 25, 100)
for _, entry := range entries {
fmt.Println(string(entry.Key), string(entry.Value))
}
return nil
})
}
PrefixScan()user_21user_209
...
user_208 dj208
user_209 dj209
user_21 dj21
user_210 dj210
范围遍历
tx.RangeScan()
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nutsdb"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "user_list"
prefix := "user_"
db.Update(func(tx *nutsdb.Tx) error {
for i := 1; i <= 300; i++ {
key := []byte(prefix + strconv.FormatInt(int64(i), 10))
val := []byte("dj" + strconv.FormatInt(int64(i), 10))
tx.Put(bucket, key, val, 0)
}
return nil
})
db.View(func(tx *nutsdb.Tx) error {
lbound := []byte("user_100")
ubound := []byte("user_199")
entries, _ := tx.RangeScan(bucket, lbound, ubound)
for _, entry := range entries {
fmt.Println(string(entry.Key), string(entry.Value))
}
return nil
})
}
获取全部
tx.GetAll()
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nutsdb"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "user_list"
prefix := "user_"
db.Update(func(tx *nutsdb.Tx) error {
for i := 1; i <= 300; i++ {
key := []byte(prefix + strconv.FormatInt(int64(i), 10))
val := []byte("dj" + strconv.FormatInt(int64(i), 10))
tx.Put(bucket, key, val, 0)
}
return nil
})
db.View(func(tx *nutsdb.Tx) error {
entries, _ := tx.GetAll(bucket)
for _, entry := range entries {
fmt.Println(string(entry.Key), string(entry.Value))
}
return nil
})
}
数据结构
nutsdblist/set/sorted setredisredislistset/sorted set
nutsdblist
LPushRPushLPopRPopLPeekRPeekLRangeLRemLSetLtrimLSizelist
下面简单演示一下如何使用这些方法,每一步的操作结果都以注释写在了命令下方:
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nutsdb"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "list"
key := []byte("userList")
db.Update(func(tx *nutsdb.Tx) error {
// 从头部依次插入多个值,注意顺序
tx.LPush(bucket, key, []byte("user1"), []byte("user3"), []byte("user5"))
// 当前list:user5, user3, user1
// 从尾部依次插入多个值
tx.RPush(bucket, key, []byte("user7"), []byte("user9"), []byte("user11"))
// 当前list:user5, user3, user1, user7, user9, user11
return nil
})
db.Update(func(tx *nutsdb.Tx) error {
// 从头部删除一个值
tx.LPop(bucket, key)
// 当前list:user3, user1, user7, user9, user11
// 从尾部删除一个值
tx.RPop(bucket, key)
// 当前list:user3, user1, user7, user9
// 从头部删除两个值
tx.LRem(bucket, key, 2)
// 当前list:user7, user9
return nil
})
db.View(func(tx *nutsdb.Tx) error {
// 头部第一个值,user7
b, _ := tx.LPeek(bucket, key)
fmt.Println(string(b))
// 长度
l, _ := tx.LSize(bucket, key)
fmt.Println(l)
return nil
})
}
Update
数据库备份
nutsdbdb.Backup()
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nutsdb"
db, _ := nutsdb.Open(opt)
key := []byte("name")
val := []byte("dj")
db.Update(func(tx *nutsdb.Tx) error {
tx.Put("", key, val, 0)
return nil
})
db.Backup("./backup")
db.Close()
opt.Dir = "./backup"
backupDB, _ := nutsdb.Open(opt)
backupDB.View(func(tx *nutsdb.Tx) error {
e, _ := tx.Get("", key)
fmt.Println(string(e.Value))
return nil
})
}
上面先备份,再从备份中加载数据库,读取键。
总结
大家如果发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue????
参考
-
nutsdb GitHub:https://github.com/xujiajun/nutsdb
-
Go 每日一库 GitHub:https://github.com/darjun/go-daily-lib
我
我的博客:https://darjun.github.io
欢迎关注我的微信公众号【GoUpUp】,共同学习,一起进步~