Beego cache模块需显式初始化,不支持同引擎多实例;memory引擎interval是GC周期非TTL,TTL由Put第三参数控制;file引擎为全局单例,须用key前缀隔离;redis需手动导入驱动且配置字段名严格匹配。

Beego 的 cache 模块不是开箱即用的全局服务,必须显式初始化并赋值给变量才能使用;不支持同一引擎类型(如 "file")多次调用 NewCache 创建隔离实例——第二次会覆盖第一次的配置和底层状态。
memory 缓存:最简启动,但注意 TTL 和 GC 间隔
内存缓存适合开发或轻量部署,无需外部依赖。关键点在于:interval 是后台清理 goroutine 的触发周期(单位秒),不是单条数据的过期时间;每条数据的存活时长由 Put(key, val, timeout) 的第三个参数控制,单位是秒。
-
timeout为 0 表示永不过期(但memory引擎内部仍会检查lifespan == 0来跳过清理) - GC 不是实时的:即使某 key 已超时,也要等到下一次
interval周期才被真正移除 - 不要在每次请求中都调用
cache.NewCache,应作为包级变量初始化一次
示例:
var Cache cache.Cache
func init() {
var err error
Cache, err = cache.NewCache("memory", `{"interval":60}`)
if err != nil {
panic(err)
}
}
// 使用
Cache.Put("user:123", userObj, 300) // 5 分钟后过期
val := Cache.Get("user:123")
file 缓存:单实例限制,必须用前缀隔离业务域
Beego 的 "file" 引擎是全局单例设计:连续两次 NewCache("file", cfg1) 和 NewCache("file", cfg2),后者会完全覆盖前者,两个变量实际指向同一底层缓存对象,所有写入都落到最后一个 CachePath 目录下。
- 无法靠不同
CachePath实现多目录隔离 - 正确做法是只初始化一个
file实例,再通过统一前缀(如"user:"、"config:")区分业务数据 -
DirectoryLevel控制子目录层级,避免单目录文件过多;EmbedExpiry是默认过期时间(秒),当Put未指定 timeout 时生效
示例:
const (
UserPrefix = "user:"
ConfigPrefix = "config:"
)
func keyWithPrefix(prefix, key string) string {
return prefix + key
}
// 初始化唯一 file 缓存
var FileCache cache.Cache
func init() {
var err error
FileCache, err = cache.NewCache("file", `{
"CachePath":"./cache",
"FileSuffix":".cache",
"DirectoryLevel":2,
"EmbedExpiry":3600
}`)
if err != nil {
panic(err)
}
}
// 使用
FileCache.Put(keyWithPrefix(UserPrefix, "123"), userData, 7200)
redis 缓存:需显式导入驱动,配置项名易错
Beego 的 redis 缓存驱动不内置,必须手动引入 _ "github.com/astaxie/beego/cache/redis" 才能注册引擎。常见错误是漏掉这个导入,导致 NewCache("redis", ...) 返回 nil + "unknown adapter" 错误。
- 配置 JSON 中的字段名必须严格匹配文档:
"conn"(不是"addr"或"host")、"dbNum"(不是"database")、"password"(空密码可省略或设为空字符串) -
"key"是 Redis key 的公共前缀,不是认证密钥;它会被自动拼接到每个缓存 key 前,用于命名空间隔离 - 连接串格式为
"127.0.0.1:6379",不带redis://协议头
示例:
import (
"github.com/astaxie/beego/cache"
_ "github.com/astaxie/beego/cache/redis" // 必须!
)
func init() {
config := `{"key":"myapp:","conn":"127.0.0.1:6379","dbNum":"0"}`
var err error
Cache, err = cache.NewCache("redis", config)
if err != nil {
panic(err)
}
}
缓存实例不能复用引擎名,但可以共存多种类型
同一个 Beego 应用里可以同时存在 memory、redis、file 多个缓存实例,只要变量名不同、初始化参数不同即可。但对同一引擎类型(比如两个 "memory"),虽然代码上能创建两个变量,它们仍是完全独立的——这点和 "file" 不同,"memory" 没有全局单例限制。
-
"memory":每次NewCache都新建一个独立的 map + timer,互不影响 -
"file"和"redis":都依赖全局adapters注册表,但各自 key 不同("file"vs"redis"),所以可共存;问题只出在重复使用同一 name - 没有
cache.DefaultCache这样的全局单例,所有缓存操作都基于你持有的变量
这意味着你可以为 session 存一份 memory 缓存,为配置存一份 redis 缓存,为静态资源元数据存一份 file 缓存——只要别在 "file" 上反复初始化就行。











