beego cache模块接入redis需满足驱动注册、配置字段严格匹配、json序列化手动处理三条件;任一缺失均导致newcache静默返回nil,后续调用panic或读不到数据。

Beego 的 cache 模块接入 Redis 不是“配个地址就能用”,它依赖驱动注册、配置字段严格匹配、序列化路径手动控制三个硬性条件;任一环节出错,NewCache 都会静默返回 nil,后续调用直接 panic 或读不到数据。
驱动必须显式导入且用下划线匿名引入
Beego cache 不自动加载任何驱动,Redis 支持靠 github.com/astaxie/beego/cache/redis 包提供。这个包必须在任意 .go 文件里以匿名方式导入,否则 NewCache("redis", ...) 根本不认识 redis 类型:
- ✅ 正确写法:
import _ "github.com/astaxie/beego/cache/redis" - ❌ 错误写法:
import "github.com/astaxie/beego/cache/redis"(有变量名或没导入都会失败) - ⚠️ 注意:该包内部依赖
github.com/gomodule/redigo/redis,但你不需要自己再 import redigo —— beego/cache/redis 已封装好
配置字符串字段名和格式不能有一处错误
NewCache 的第二个参数是 JSON 字符串,不是 map,且字段名必须与驱动源码完全一致(大小写、拼写、是否带引号都算):
- 必需字段只有三个:
"conn"(不是"address")、"dbNum"(不是"database")、"password"(即使为空也得写"") - ✅ 正确示例:
{"conn":"127.0.0.1:6379","dbNum":"0","password":""} - ❌ 常见错误:
{"address":"...", "database":0}、{"conn": "127.0.0.1:6379", "dbNum": 0}(数字没加引号)、多空格或换行导致 JSON 解析失败 - ⚠️
"key"字段可选,仅用于设置 Redis key 前缀,不填则无前缀;但它不会影响连接本身
存取 struct 必须自己处理 JSON 序列化
cache.Put 和 cache.Get 对值不做类型推断,底层全按 []byte 存,GetString() 只是简单 string(v.([]byte)) 强转 —— 所以你不能直接传 struct:
- ❌ 错误:
bm.Put("user:1001", userStruct, time.Hour)→ 存的是fmt.Sprintf("%+v", userStruct),不可靠且无法反解 - ✅ 正确存:
data, _ := json.Marshal(userStruct); bm.Put("user:1001", data, time.Hour) - ✅ 正确取:
if b := bm.Get("user:1001"); b != nil { json.Unmarshal(b.([]byte), &target) }(比GetString更稳妥,避免中间 string 转换丢精度) - ⚠️ 注意 struct 字段必须首字母大写 + 加
json:tag,否则json.Marshal会忽略非导出字段,反解出来是空对象
初始化失败时没有报错,但后续操作会崩溃
cache.NewCache 在驱动未注册或配置解析失败时,**不 panic、不 log、不返回 error**,而是直接返回 nil。这意味着:
- 你必须显式检查返回值:
if redisCache == nil || err != nil { panic("redis cache init failed") } - 一旦漏掉这步,后面调用
redisCache.Put就会 panic:invalid memory address or nil pointer dereference - 线上环境建议配合
beego.Error记日志,并在启动阶段做一次Put/Get连通性验证
最易被忽略的点是:配置字符串里所有字段值都必须是字符串类型("0" 而非 0),且 password 字段不能省略 —— 即使 Redis 没设密码,也得写 ""。少一个引号、多一个空格、错一个字母,缓存就彻底静默失效,而你根本收不到任何提示。











