1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-18 14:46:06 +08:00
Files
mlsr/tests/buntDB_test.go
T

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
})
}