13
2019
12

golang memorycache 轻量级内存缓存,高性能,防穿透、击穿

项目地址


非常轻便,性能好,适合单机使用。



使用流程:


1. c := memorycache.New() new一个对象


2. 然后

    c.Get(key interface{}, f ...func(key, old interface{}) (v interface{}, t int64) ) interface{}

这个方法结合了 获取设置 缓存功能,你可能想 卧槽这不按常理出牌啊。这么设计是为了提升性能和易用性,你大可一试,你会发现,哎哟,可以哟。

    key参数应该不用介绍了吧,

    f ...func(key, old interface{}) (v interface{}, t int64),一个创建数据的函数,当没有缓存或缓存过期时,自动调用该函数生成新的缓存,old是传入旧的数据,你可以在它被销毁之前见最后一面,该函数应该返回将被缓存的数据和过期时间,0永不过期,单位秒。


3. 其他方法

    c.Delete(key interface{})

    这个方法用来删除缓存,很简单就不介绍了。

    c.SetExpire(key interface{}, expire int64) bool

    设置缓存时间

    c.Each(f func(k, v interface{}))

    遍历缓存


memorycache.GC()
清理过期的数据,需要手动调用,比如放到定时任务中
如果数据总量不多,建议懒得GC


测试和使用例子:

package main

import (
    "fmt"
    "sync"
    "time"

    "wego/memorycache"
)

func main() {
    // f 用于生成数据的函数
    f := func(key,old interface{}) (interface{},int64){
        fmt.Println("如果多次显示这条信息,代表发生了 穿透 和 击穿")
        return nil, 0
    }

    // new 一个 缓存
    c := memorycache.New()

    // 开1000个协程测试应该够了
    // 目前使用的是公司配的渣渣电脑(因为害怕崩溃到发抖o((⊙﹏⊙))o.)
    now := time.Now()
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            // 获取缓存,如果不存在或过期就用 f() 创建
            c.Get("key", f)
            wg.Add(-1)
        }()

    }
    wg.Wait()
    // 消耗时间
    fmt.Println(time.Since(now))
    // 输出结果
    //////////////////////////////////////////////
    // $ go run 1.go
    // 如果多次显示这条信息,代表发生了 穿透 和 击穿
    // 1.0001ms
    //////////////////////////////////////////////
    // 分析:可以看到整个过程只消耗了 1ms 左右,所以应该没有发生雪崩,不然消耗时间应该 1s 以上

    // 接下来测试过期
    // 设置缓存,有效 4s
    c.Get("a"func(key,old interface{}) (interface{},int64) {
        return 111,4
    })
    // 3s 后获取
    time.Sleep(3 * time.Second)
    fmt.Println(c.Get("a"nil))
    // 4s 后获取
    time.Sleep(1 * time.Second)
    fmt.Println(c.Get("a"nil))
    // 输出结果
    //////////////////////////////////////////////
    // $ go run 1.go
    // 如果多次显示这条信息,代表发生了 穿透 和 击穿
    // 0s
    // 111
    // <nil>
    //////////////////////////////////////////////
}


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。