点击链接查看我的个人博客,文章更全更详细
NutsDB是纯Go语言编写一个简单、高性能、内嵌型、持久化的key-value数据库。
NutsDB支持事务,从v0.2.0之后的版本开始支持ACID的特性,建议使用最新的release版本。v0.2.0之前的版本,保持高性能,没有作sync,但是具备高性能的写(本地测试,百万数据写入达40~50W+/s)。所有的操作都在事务中执行。NutsDB从v0.2.0版本开始支持多种数据结构,如列表(list)、集合(set)、有序集合(sorted set)。从0.4.0版本开始增加自定义配置读写方式、启动时候的文件载入方式、sync是否开启等
同一个桶的key不能重复,不同桶中的key 可以重复
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
key := []byte("go")
val := []byte("go1.17")
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("key1: ", string(e.Key))
fmt.Println("val1: ", string(e.Value))
fmt.Println("meta1: ", e.Meta)
e, _ = tx.Get("bucket2", key)
fmt.Println("key2: ", string(e.Key))
fmt.Println("val2: ", string(e.Value))
fmt.Println("meta2: ", e.Meta)
return nil
})
}
Put()支持传入过期时间
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, err := nutsdb.Open(opt)
if err != nil {
log.Fatal(err)
}
defer db.Close()
key := []byte("go")
val := []byte("go-value")
db.Update(func(tx *nutsdb.Tx) error {
tx.Put("", key, val, 10)
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
})
}
Put() 值存在就更新,不存在就写入
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
key := []byte("go")
val := []byte("go_value")
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
})
}
键是以字节顺序保存的。
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "order_list"
prefix := "order_"
db.Update(func(tx *nutsdb.Tx) error {
for i := 0; i < 1000; i++ {
key := []byte(prefix + strconv.FormatInt(int64(i), 10))
value := []byte("go" + strconv.FormatInt(int64(i), 10))
tx.Put(bucket, key, value, 0)
}
return nil
})
db.View(func(tx *nutsdb.Tx) error {
entries, _, _ := tx.PrefixScan(bucket, []byte(prefix), 25, 900)
for _, entry := range entries {
fmt.Println(string(entry.Key), string(entry.Value))
}
return nil
})
}
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "order_list"
prefix := "order_"
db.View(func(tx *nutsdb.Tx) error {
lbound := []byte(prefix + "100")
ubound := []byte(prefix + "199")
entries, _ := tx.RangeScan(bucket, lbound, ubound)
for _, entry := range entries {
fmt.Println(string(entry.Key), string(entry.Value))
}
return nil
})
}
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "order_list"
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
})
}
LPush: 从头部插入元素
LSize: 返回list长度
LPeek: 返回头部第一个元素
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "order_list"
key := []byte("apple")
db.Update(func(tx *nutsdb.Tx) error {
tx.LPush(bucket, key, []byte("apple1"), []byte("apple2"), []byte("apple3"))
return nil
})
db.View(func(tx *nutsdb.Tx) error {
b, _ := tx.LPeek(bucket, key)
fmt.Println(string(b))
l, _ := tx.LSize(bucket, key)
fmt.Println(l)
return nil
})
}
RPush: 从头部插入元素
RPeek: 返回头部第一哥元素
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "order_list"
key := []byte("apple")
db.Update(func(tx *nutsdb.Tx) error {
tx.RPush(bucket, key, []byte("apple1"), []byte("apple2"), []byte("apple3"))
return nil
})
db.View(func(tx *nutsdb.Tx) error {
b, _ := tx.RPeek(bucket, key)
fmt.Println(string(b))
l, _ := tx.LSize(bucket, key)
fmt.Println(l)
return nil
})
}
LPop: 从头部删除一个元素
RPop: 从尾部删除一个元素
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
defer db.Close()
bucket := "order_list"
key := []byte("apple")
db.Update(func(tx *nutsdb.Tx) error {
pop, err := tx.LPop(bucket, key)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(pop))
rPop, err := tx.RPop(bucket, key)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(rPop))
return nil
})
db.View(func(tx *nutsdb.Tx) error {
l, _ := tx.LSize(bucket, key)
fmt.Println(l)
return nil
})
}
func main() {
opt := nutsdb.DefaultOptions
opt.Dir = "./nuts_db"
db, _ := nutsdb.Open(opt)
bucket := "order_list"
key := []byte("apple")
db.Backup("./backup")
db.Close()
opt.Dir = "./backup"
bdb, _ := nutsdb.Open(opt)
bdb.View(func(tx *nutsdb.Tx) error {
l, err := tx.LSize(bucket, key)
if err != nil {
fmt.Println("get apple list size err", err)
}
fmt.Println(l)
return nil
})
}