缓存组件默认提供了一个高速的内存缓存,操作效率非常高效, CPU
性能损耗在 ns
纳秒级别。
使用示例
基本使用
package main
import (
"fmt"
"github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
// 创建一个缓存对象,
// 当然也可以便捷地直接使用gcache包方法
var (
ctx = gctx.New()
cache = gcache.New()
)
// 设置缓存,不过期
err := cache.Set(ctx, "k1", "v1", 0)
if err != nil {
panic(err)
}
// 获取缓存值
value, err := cache.Get(ctx, "k1")
if err != nil {
panic(err)
}
fmt.Println(value)
// 获取缓存大小
size, err := cache.Size(ctx)
if err != nil {
panic(err)
}
fmt.Println(size)
// 缓存中是否存在指定键名
b, err := cache.Contains(ctx, "k1")
if err != nil {
panic(err)
}
fmt.Println(b)
// 删除并返回被删除的键值
removedValue, err := cache.Remove(ctx, "k1")
if err != nil {
panic(err)
}
fmt.Println(removedValue)
// 关闭缓存对象,让GC回收资源
if err = cache.Close(ctx); err != nil {
panic(err)
}
}
执行后,输出结果为:
1
true
v1
过期控制
package main
import (
"fmt"
"github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/gctx"
"time"
)
func main() {
var (
ctx = gctx.New()
)
// 当键名不存在时写入,设置过期时间1000毫秒
_, err := gcache.SetIfNotExist(ctx, "k1", "v1", time.Second)
if err != nil {
panic(err)
}
// 打印当前的键名列表
keys, err := gcache.Keys(ctx)
if err != nil {
panic(err)
}
fmt.Println(keys)
// 打印当前的键值列表
values, err := gcache.Values(ctx)
if err != nil {
panic(err)
}
fmt.Println(values)
// 获取指定键值,如果不存在时写入,并返回键值
value, err := gcache.GetOrSet(ctx, "k2", "v2", 0)
if err != nil {
panic(err)
}
fmt.Println(value)
// 打印当前的键值对
data1, err := gcache.Data(ctx)
if err != nil {
panic(err)
}
fmt.Println(data1)
// 等待1秒,以便k1:v1自动过期
time.Sleep(time.Second)
// 再次打印当前的键值对,发现k1:v1已经过期,只剩下k2:v2
data2, err := gcache.Data(ctx)
if err != nil {
panic(err)
}
fmt.Println(data2)
}
执行后,输出结果为:
[k1]
[v1]
v2
map[k1:v1 k2:v2]
map[k2:v2]
GetOrSetFunc*
GetOrSetFunc
获取一个缓存值,当缓存不存在时执行指定的 f func(context.Context) (interface{}, error)
,缓存该 f
方法的结果值,并返回该结果。
需要注意的是, GetOrSetFunc
的缓存方法参数 f
是在缓存的 锁机制外执行,因此在 f
内部也可以嵌套调用 GetOrSetFunc
。但如果 f
的执行比较耗时,高并发的时候容易出现 f
被多次执行的情况(缓存设置只有第一个执行的 f
返回结果能够设置成功,其余的被抛弃掉)。而 GetOrSetFuncLock
的缓存方法 f
是在缓存的 锁机制内执行