使用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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!