使用golang实现前缀树缓存
如果只是简单写个工具,需要用到临时缓存,但是又不想引入redis之类的可以看过来了;
目前常用的临时缓存库,大部分都是使用了map来实现的,非map的也都是一些比较大型的库,并不轻量化,如果这样的话还不如使用redis;
如果我只是单纯的set 和 get操作,使用map来实现的库是很方便,但是如果我存储了以下数据
user&&zhangsan&&age&&56 xxxxx
user&&lisi&&age&&54 xxxxx
country&&usa&&type&&capitalism xxx
country&&china&&type&&socialism xxx
country&&japan&&type&&feudalism xxx
school&&qinghua&&age&&111 xxx
我如果只想拿到全部 user 类型的数据,这时候我唯一的办法只能是遍历整个表,如果数据多了以后,这显然是很不友好的一件事情
这种情况我们就可以使用前缀树来实现了,前缀树的本质就还是树形结构
树形结构的初始节点,我们设置成空字符串,后边的子节点,每个位置只允许初选一个字符,如果key是hello的话,那么就是root->h->e->l->l->o这样的结构,在o的位置上,我们存储value值;
如果是前缀扫描的话,比如说 user&&zhangsan&&age&&56 那么可以用user&&* 来扫描,先拿到 user&&的节点,然后进行递归,就可以拿到全部的user&&* 值
地址 https://github.com/lzy1102/triecache
用法首先导入 go get -u github.com/lzy1102/triecache
package main
import (
"fmt"
"github.com/lzy1102/triecache"
"time"
)
func main() {
key := "hellofdafas123"
key2 := "helloerqwr456"
value := 10
var c triecache.Cache
c = triecache.New(time.Minute*5, time.Second*10)
err := c.Set(key, value, time.Second*10)
if err != nil {
panic(err)
}
c.Set(key2, value, time.Second)
time.Sleep(time.Second * 2)
get, err := c.Get(key)
if err != nil {
fmt.Println(err)
}
fmt.Println("key ", key, " value ", get)
get, err = c.Get(key2)
if err != nil {
fmt.Println(err)
}
fmt.Println("key2 ", key2, " value2 ", get)
keys, err := c.Keys("hello*")
if err != nil {
fmt.Println(err)
}
fmt.Println("keys ", keys)
for _, s := range keys {
v, _ := c.Get(s)
fmt.Println(s, v)
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: