mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-18 14:46:06 +08:00
215 lines
5.3 KiB
Go
215 lines
5.3 KiB
Go
// Package tests
|
|
// @Author: Wang Feng
|
|
// @Description: buntDB-一种开源的内存键值库
|
|
// 源代码:https://github.com/tidwall/buntdb
|
|
// 使用方法:https://segmentfault.com/a/1190000022102931
|
|
// https://darjun.github.io/2020/03/21/godailylib/buntdb/
|
|
// @Version: 0.1.0
|
|
// @Date: 2022/4/6 16:00
|
|
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
|
//
|
|
|
|
package tests
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/tidwall/buntdb"
|
|
"log"
|
|
"testing"
|
|
)
|
|
|
|
//
|
|
// TestSetAndGet_In_UpdateAndView
|
|
// @Description: 创建数据库,设置数据库参数
|
|
// @param t
|
|
//
|
|
func TestSetAndGet_In_UpdateAndView(t *testing.T) {
|
|
db, err := buntdb.Open(":memory:")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
db.Update(func(tx *buntdb.Tx) error {
|
|
oldValue, replaced, err := tx.Set("testkey", "testvalue", nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("old value:%q replaced:%t\n", oldValue, replaced)
|
|
return nil
|
|
})
|
|
|
|
db.View(func(tx *buntdb.Tx) error {
|
|
value, err := tx.Get("testkey")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Println("value is:", value)
|
|
return nil
|
|
})
|
|
}
|
|
|
|
//
|
|
// TestAscend
|
|
// @Description:
|
|
// Ascend()方法接收一个索引名,然后以该索引定义的顺序遍历所有键值对
|
|
// 如果未指定索引名,则根据键升序遍历
|
|
// @param t
|
|
//
|
|
func TestAscend(t *testing.T) {
|
|
db, err := buntdb.Open(":memory:")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
db.Update(func(tx *buntdb.Tx) error {
|
|
data := map[string]string{
|
|
"a": "apple",
|
|
"b": "banana",
|
|
"p": "pear",
|
|
"o": "orange",
|
|
}
|
|
for key, value := range data {
|
|
tx.Set(key, value, nil)
|
|
}
|
|
return nil
|
|
})
|
|
|
|
db.View(func(tx *buntdb.Tx) error {
|
|
var count int
|
|
tx.Ascend("", func(key, value string) bool {
|
|
fmt.Printf("key:%s value:%s\n", key, value)
|
|
count++
|
|
if count >= 3 {
|
|
return false
|
|
}
|
|
return true
|
|
})
|
|
return nil
|
|
})
|
|
}
|
|
|
|
//
|
|
// TestCreatIndex
|
|
// @Description: buntDB将数据以键排序存储到b-tree中
|
|
// 可以创建自定义索引,这样就可以对值进行排序了。传入索引名、键名、值大小判断方法
|
|
// @param t
|
|
//
|
|
func TestCreatIndex(t *testing.T) {
|
|
db, err := buntdb.Open(":memory:")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
db.CreateIndex("names", "user:*:name", buntdb.IndexString)
|
|
db.Update(func(tx *buntdb.Tx) error {
|
|
tx.Set("user:1:name", "tom", nil)
|
|
tx.Set("user:2:name", "Randi", nil)
|
|
tx.Set("user:3:name", "jane", nil)
|
|
tx.Set("user:4:name", "Janet", nil)
|
|
tx.Set("user:5:name", "Paula", nil)
|
|
tx.Set("user:6:name", "peter", nil)
|
|
tx.Set("user:7:name", "Terri", nil)
|
|
return nil
|
|
})
|
|
|
|
db.View(func(tx *buntdb.Tx) error {
|
|
tx.Ascend("names", func(key, value string) bool {
|
|
fmt.Printf("%s: %s\n", key, value)
|
|
return true
|
|
})
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func TestStructIndex(t *testing.T) {
|
|
db, _ := buntdb.Open(":memory:")
|
|
defer db.Close()
|
|
|
|
db.CreateIndex("first_name", "user:*", buntdb.IndexJSON("name.first"))
|
|
db.CreateIndex("age", "user:*", buntdb.IndexJSON("age"))
|
|
db.Update(func(tx *buntdb.Tx) error {
|
|
tx.Set("user:1", `{"name":{"first":"zhang","last":"san"},"age":18}`, nil)
|
|
tx.Set("user:2", `{"name":{"first":"li","last":"si"},"age":27`, nil)
|
|
tx.Set("user:3", `{"name":{"first":"wang","last":"wu"},"age":32}`, nil)
|
|
tx.Set("user:4", `{"name":{"first":"sun","last":"qi"},"age":8}`, nil)
|
|
return nil
|
|
})
|
|
|
|
// 不行。buntDB只能存key和value均是string类型的键值对。
|
|
}
|
|
|
|
//
|
|
// TestJSONIndex
|
|
// @Description: 当值为json字符串时,可以按照json字符串中的键进行排序
|
|
// @param t
|
|
//
|
|
func TestJSONIndex(t *testing.T) {
|
|
db, _ := buntdb.Open(":memory:")
|
|
defer db.Close()
|
|
|
|
db.CreateIndex("first_name", "user:*", buntdb.IndexJSON("name.first"))
|
|
db.CreateIndex("age", "user:*", buntdb.IndexJSON("age"))
|
|
db.Update(func(tx *buntdb.Tx) error {
|
|
tx.Set("user:1", `{"name":{"first":"zhang","last":"san"},"age":18}`, nil)
|
|
tx.Set("user:2", `{"name":{"first":"li","last":"si"},"age":27}`, nil)
|
|
tx.Set("user:3", `{"name":{"first":"wang","last":"wu"},"age":32}`, nil)
|
|
tx.Set("user:4", `{"name":{"first":"sun","last":"qi"},"age":8}`, nil)
|
|
return nil
|
|
})
|
|
|
|
db.View(func(tx *buntdb.Tx) error {
|
|
fmt.Println("Order by first name")
|
|
tx.Ascend("first_name", func(key, value string) bool {
|
|
fmt.Printf("%s: %s\n", key, value)
|
|
return true
|
|
})
|
|
|
|
fmt.Println("Order by age")
|
|
tx.Ascend("age", func(key, value string) bool {
|
|
fmt.Printf("%s: %s\n", key, value)
|
|
return true
|
|
})
|
|
|
|
fmt.Println("Order by age range 18-30")
|
|
tx.AscendRange("age", `{"age":18}`, `{"age":30}`, func(key, value string) bool {
|
|
fmt.Printf("%s: %s\n", key, value)
|
|
return true
|
|
})
|
|
return nil
|
|
})
|
|
}
|
|
|
|
//
|
|
// TestExpiresTime
|
|
// @Description: 在增加数据库条目时,设置过期时间
|
|
// @param t
|
|
//
|
|
func TestExpiresTime(t *testing.T) {
|
|
db, _ := buntdb.Open(":memory:")
|
|
defer db.Close()
|
|
|
|
db.Update(func(tx *buntdb.Tx) error {
|
|
//tx.Set("testkey", "testvalue", &buntdb.SetOptions{Expires: true, TTL: time.Second})
|
|
tx.Set("testkey", "testvalue",nil)
|
|
return nil
|
|
})
|
|
|
|
db.View(func(tx *buntdb.Tx) error {
|
|
value, _ := tx.Get("testkey")
|
|
fmt.Println("value is:", value)
|
|
return nil
|
|
})
|
|
|
|
//time.Sleep(time.Second)
|
|
|
|
db.View(func(tx *buntdb.Tx) error {
|
|
value, _ := tx.Get("testkey")
|
|
fmt.Println("after expire, value is:", value)
|
|
return nil
|
|
})
|
|
} |