使用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.Minute*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) } }