gcache

    使用方式

    接口文档

    https://godoc.org/github.com/gogf/gf/os/gcache

    gcache可以使用New方法创建使用,并且也可以使用包方法使用。在通过包方法使用缓存功能时,操作的是gcache默认提供的一个gcache.Cache对象,具有全局性,因此在使用时注意全局键名的覆盖。

    gcache存储的键值类型是interface{},也就是说可以存储任意的数据类型,当获取数据时返回的也是interface{}类型,若需要转换为其他的类型可以通过gcacheGet*方法便捷获取常见类型。

    另外需要注意的是,gcache的缓存过期时间参数duration的类型为time.Duration类型,在Set缓存变量时,如果缓存时间参数duration = 0表示不过期,duration < 0表示立即过期,expire > 0表示超时过期。

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/gogf/gf/os/gcache"
    5. )
    6. func main() {
    7. // 创建一个缓存对象,
    8. // 当然也可以便捷地直接使用gcache包方法
    9. c := gcache.New()
    10. // 设置缓存,不过期
    11. c.Set("k1", "v1", 0)
    12. fmt.Println(c.Get("k1"))
    13. // 获取缓存大小
    14. // 缓存中是否存在指定键名
    15. fmt.Println(c.Contains("k1"))
    16. // 删除并返回被删除的键值
    17. fmt.Println(c.Remove("k1"))
    18. // 关闭缓存对象,让GC回收资源
    19. c.Close()
    20. }

    执行后,输出结果为:

    1. v1
    2. 1
    3. true
    4. v1

    执行后,输出结果为:

    1. [k1]
    2. [v1]
    3. v2
    4. map[k1:v1 k2:v2]
    5. map[k2:v2]

    需要注意的是,GetOrSetFunc的缓存方法参数f是在缓存的锁机制外执行,因此在f内部也可以嵌套调用GetOrSetFunc。但如果f的执行比较耗时,高并发的时候容易出现f被多次执行的情况(缓存设置只有第一个执行的f返回结果能够设置成功,其余的被抛弃掉)。

    GetOrSetFuncLock的缓存方法f是在缓存的锁机制内执行,因此可以保证当缓存项不存在时只会执行一次f,但是缓存写锁的时间随着f方法的执行时间而定。

    我们来看一个在项目中使用GetOrSetFunc的示例,该示例遍历检索markdown文件进行字符串检索,并根据指定的搜索key缓存该结果值,因此多次搜索该key时,第一次会执行目录遍历搜索,后续将直接使用缓存结果。

    1. // 根据关键字进行markdown文档搜索,返回文档path列表
    2. func SearchMdByKey(key string) []string {
    3. glog.Cat("search").Println(key)
    4. v := cache.GetOrSetFunc("doc_search_result_" + key, func() interface{} {
    5. // 当该key的检索缓存不存在时,执行检索
    6. array := garray.NewStringArray(0, 0, false)
    7. docPath := g.Config().GetString("doc.path")
    8. // 当目录列表不存在时,执行检索
    9. paths, _ := gfile.ScanDir(docPath, "*.md", true)
    10. return paths
    11. }, 0)
    12. // 遍历markdown文件列表,执行字符串搜索
    13. for _, path := range gconv.Strings(paths) {
    14. content := gfcache.GetContents(path)
    15. if len(content) > 0 {
    16. if strings.Index(content, key) != -1 {
    17. index := gstr.Replace(path, ".md", "")
    18. index = gstr.Replace(index, docPath, "")
    19. array.Append(index)
    20. }
    21. }
    22. }
    23. return array.Slice()
    24. }, 0)
    25. return gconv.Strings(v)
    26. }
    1. 10
    2. [2 4 5 7 8 9 0 1 3 6]
    3. 1
    4. 2
    5. [1 9]
    1. CPU: Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz
    2. SYS: Ubuntu 16.04 amd64

    测试结果