基本介绍

gcache 是提供统一的缓存管理模块,提供了开发者可自定义灵活接入的缓存适配接口,并默认提供了高速内存缓存适配实现。

使用方式

  1. import "github.com/gogf/gf/v2/os/gcache"

接口文档

https://pkg.go.dev/github.com/gogf/gf/v2/os/gcache

简要介绍:

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

  2. gcache 使用的键名类型是 interface{},而不是 string 类型,这意味着我们可以使用任意类型的变量作为键名,但大多数时候建议使用 string 或者 []byte 作为键名,并且统一键名的数据类型,以便维护。

  3. gcache 存储的键值类型是 interface{},也就是说可以存储任意的数据类型,当获取数据时返回的也是 interface{} 类型,若需要转换为其他的类型可以通过 gcacheGet* 方法便捷获取常见类型。注意,如果您确定知道自己使用的是内存缓存,那么可以直接使用断言方式对返回的 interface{} 变量进行类型转换,否则建议通过获取到的泛型对象对应方法完成类型转换。

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

注意事项

关于键名数据类型

大家可以发现缓存组件中关于键值对的数据类型都是 interface{},这种设计主要是为了考虑通用性和易用性,但是使用上需要注意 interface{} 的比较:只有 数据类型 都相等才算真正匹配。我们来看个例子。

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/os/gcache"
  5. "github.com/gogf/gf/v2/os/gctx"
  6. )
  7. func main() {
  8. var (
  9. ctx = gctx.New()
  10. key1 int32 = 1
  11. key2 float64 = 1
  12. value = `value`
  13. )
  14. _ = gcache.Set(ctx, key1, value, 0)
  15. fmt.Println(gcache.MustGet(ctx, key1).Val())
  16. fmt.Println(gcache.MustGet(ctx, key2).Val())
  17. }

执行后,终端输出:

  1. <nil>

可以看到,虽然 key1key2 的数值都是相同的,但是两者类型不同,因此通过 key2 无法获取到键值。

关于获取对象键值

由于键值的类型也是 interface{},往往在获取后会通过类型转换为需要的数据类型。常见的类型转换是直接使用类型断言,这种做法有种风险,就是由于 gcache 组件采用 适配器接口设计模式,因此底层的实现上(除了默认的内存适配器)往往会改变原有的数据类型(非内存实现往往都会涉及到序列化/反序列化存储),因此不推荐大家直接使用类型断言进行数据类型转换。

因此缓存组件在获取键值上做了改进,并不是直接返回 interface{} 的键值类型,而是以框架泛型 *gvar.Var 对象返回,开发者根据业务场景转换为所需的数据类型。特别是针对于对象缓存存储和读取的场景特别有用,我们来看一个示例:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/os/gcache"
  5. "github.com/gogf/gf/v2/os/gctx"
  6. )
  7. func main() {
  8. type User struct {
  9. Id int
  10. Name string
  11. Site string
  12. }
  13. var (
  14. ctx = gctx.New()
  15. user *User
  16. key = `UserKey`
  17. value = &User{
  18. Id: 1,
  19. Name: "GoFrame",
  20. Site: "https://goframe.org",
  21. }
  22. )
  23. err := gcache.Set(ctx, key, value, 0)
  24. if err != nil {
  25. panic(err)
  26. }
  27. v, err := gcache.Get(ctx, key)
  28. if err != nil {
  29. panic(err)
  30. }
  31. if err = v.Scan(&user); err != nil {
  32. panic(err)
  33. }
  34. fmt.Printf(`%#v`, user)
  35. }

执行后,终端输出:

  1. &main.User{Id:1, Name:"GoFrame", Site:"https://goframe.org"}

相关文档

📄️ 缓存管理-接口设计GoFrame框架中缓存管理组件的接口设计与实现,提供了Adapter接口,使得开发者可以灵活地注册并自定义缓存管理对象,实现不同缓存策略的无缝接入。详细描述了如何通过SetAdapter和GetAdapter方法进行接口实现的注册与获取。

📄️ 缓存管理-内存缓存使用GoFrame框架的内存缓存进行高效缓存管理,包括缓存的基本使用方法、过期控制、GetOrSetFunc函数的使用以及LRU缓存淘汰控制。通过示例代码详细展示了如何设置缓存、获取缓存值以及进行并发控制等操作,旨在帮助用户优化程序性能。

📄️ 缓存管理-Redis缓存GoFrame框架中的缓存管理模块,重点讲解Redis缓存的适配实现及其使用方法,通过示例展示如何在多节点环境下确保数据一致性。文中提供了设置Redis客户端和使用Redis缓存适配器的详细步骤,同时探讨了Clear和Size方法在多对象连接情况下的操作注意事项,并建议针对不同业务配置独立的Redis db。

📄️ 缓存管理-方法介绍在GoFrame框架中使用缓存管理的方法,包括基本的设置和获取操作、适配器设置方法及缓存更新策略。用户可以通过示例代码了解如何在GoFrame框架中高效管理和操作缓存数据。