Beego v2 的 cache 模块需显式导入驱动包,否则 NewCache 会静默返回 nil 和 “unknown adapter” 错误;memory 和 file 引擎内置可用,但 memory 的 Get 是取即删,file 是全局单例;Redis/Memcached 驱动必须用空白导入且路径含 /v2,配置须为合法 JSON 并严格匹配字段名。

beego/cache 模块本身不包含任何缓存驱动
直接 go get github.com/beego/beego/v2 不会自动带 cache 扩展,更不会附带 memcache 或 redis 驱动。你必须显式安装并导入对应驱动包,否则 cache.NewCache("redis", cfg) 会返回 nil 和 "unknown adapter" 错误——这个错误容易被忽略,因为 Beego 不 panic,只静默失败。
安装命令和导入方式需严格对应:
-
go get github.com/beego/beego/v2/cache—— 基础接口与通用逻辑 -
go get github.com/beego/beego/v2/cache/memcache—— Memcached 驱动(注意路径已从astaxie迁移) -
go get github.com/beego/beego/v2/cache/redis—— Redis 驱动(底层仍用 redigo)
导入时必须用空白导入:import _ "github.com/beego/beego/v2/cache/redis",否则注册不生效。
Beego v2 的导入路径不能写错
v2 版本的全部模块路径都带 /v2 后缀,旧版 github.com/astaxie/beego/cache 在 v2 中已废弃,硬编码使用会导致编译失败或运行时 nil panic。
常见错误包括:
- 在
go.mod中误写require github.com/astaxie/beego v1.12.3—— 混用 v1/v2 依赖会引发符号冲突 - 代码中 import
"github.com/astaxie/beego/cache"—— 应改为"github.com/beego/beego/v2/cache" - 驱动包也漏掉
/v2,比如写成import _ "github.com/astaxie/beego/cache/redis"—— 实际不存在该路径
验证是否成功:运行 go list -f '{{.Dir}}' github.com/beego/beego/v2/cache,输出应为本地模块路径,而非报错。
file 和 memory 引擎无需额外驱动,但有隐含限制
"memory" 和 "file" 是内置引擎,只要导入 github.com/beego/beego/v2/cache 就能直接用,不需要额外 go get 或空白导入。
但要注意两个关键限制:
-
"file"引擎是全局单例:多次调用cache.NewCache("file", cfg1)和cache.NewCache("file", cfg2)会互相覆盖,最终所有操作都落到最后一次配置的目录下 -
"memory"引擎的Get()是“取即删”语义:调用一次Get("key")后,该 key 就从缓存中移除,IsExist("key")立即返回false—— 这不是 bug,是设计如此
如果需要多目录文件缓存或可重复读取的内存缓存,得自己封装前缀或换用其他方案(如 go-redis)。
初始化失败时优先检查配置格式和驱动注册
cache.NewCache 返回 nil 且 error 为 nil 或空字符串,大概率是驱动没注册;若 error 是 "unknown adapter",一定是忘了空白导入驱动包。
Redis 初始化还常因 JSON 配置错位失败:
-
"conn"写成"address"或"host"—— redigo 解析失败,静默返回nil -
"dbNum"和"password"必须是字符串,写0或mypass@123会解析出错 - 密码含
@、/等字符,必须 URL 编码,例如mypass%40123
最稳妥的做法:先用 json.Unmarshal 校验配置字符串是否合法,再传给 NewCache。
真正麻烦的不是装不上,而是装上了却没生效——驱动没注册、路径写错、配置格式不对,三者任一出问题,NewCache 都只默默返回 nil,后续调用 Put/Get 全部 panic。











