GoFrame 内存缓存之gcache

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

基本概念

gcache模块默认提供的是一个高速的内存缓存,操作效率非常高效,CPU性能损耗在ns纳秒级别。

基本使用

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
)

func main() {
   // 创建一个缓存对象,
   // 当然也可以便捷地直接使用gcache包方法
   c := gcache.New()

   // 设置缓存,不过期
   c.Set("k1", "v1", 0)

   // 获取缓存
   v, _ := c.Get("k1")
   fmt.Println(v)

   // 获取缓存大小
   n, _ := c.Size()
   fmt.Println(n)

   // 缓存中是否存在指定键名
   b, _ := c.Contains("k1")
   fmt.Println(b)

   // 删除并返回被删除的键值
   fmt.Println(c.Remove("k1"))

   // 关闭缓存对象,让GC回收资源
   c.Close()
}
复制代码

打印结果

image.png

缓存控制

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)

func main() {
   // 当键名不存在时写入,设置过期时间1000毫秒
   gcache.SetIfNotExist("k1", "v1", 1000*time.Millisecond)

   // 打印当前的键名列表
   keys, _ := gcache.Keys()
   fmt.Println(keys)

   // 打印当前的键值列表
   values, _ := gcache.Values()
   fmt.Println(values)

   // 获取指定键值,如果不存在时写入,并返回键值
   v, _ := gcache.GetOrSet("k2", "v2", 0)
   fmt.Println(v)

   // 打印当前的键值对
   data1, _ := gcache.Data()
   fmt.Println(data1)

   // 等待1秒,以便k1:v1自动过期
   time.Sleep(time.Second)

   // 再次打印当前的键值对,发现k1:v1已经过期,只剩下k2:v2
   data2, _ := gcache.Data()
   fmt.Println(data2)
}
复制代码

打印结果

image.png

缓存淘汰控制

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)

func main() {
   // 设置LRU淘汰数量
   c := gcache.New(2)

   // 添加10个元素,不过期
   for i := 0; i < 10; i++ {
      c.Set(i, i, 0)
   }
   n, _ := c.Size()
   fmt.Println(n)
   keys, _ := c.Keys()
   fmt.Println(keys)

   // 读取键名1,保证该键名是优先保留
   v, _ := c.Get(1)
   fmt.Println(v)

   // 等待一定时间后(默认1秒检查一次),
   // 元素会被按照从旧到新的顺序进行淘汰
   time.Sleep(2 * time.Second)
   n, _ = c.Size()
   fmt.Println(n)
   keys, _ = c.Keys()
   fmt.Println(keys)
}
复制代码

打印结果

image.png

小技巧

GetOrSetFunc的使用

GetOrSetFunc获取一个缓存值,当缓存不存在时执行指定的f func() (interface{}, error),缓存该f方法的结果值,并返回该结果。

总结

这篇文章为大家介绍了gcache的基本使用。单机应用可以使用gcache做缓存处理,分布式应用可以使用gredis做缓存处理,下一篇介绍gredis的使用。

最后

感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!

8e95dac1fd0b2b1ff51c08757667c47a.gif

猜你喜欢

转载自juejin.im/post/7107986667293638663