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

  

 

 
posted @ 2022-09-15 12:01  飞天艾特小猪  阅读(108)  评论(0编辑  收藏  举报