Revel 官方不支持 Redis 缓存开箱即用,需手动实现 cache.Cache 接口并注册;必须统一序列化方式(推荐 JSON)、加 key 前缀、显式管理 TTL,且 Session 与缓存完全解耦。

Revel 官方不支持 Redis 缓存开箱即用
Revel 的 cache 包只原生实现了 memcached 后端,cache.impl=redis 在 app.conf 里直接写是无效的,运行时不会报错,但所有 cache.Get/cache.Set 调用都静默失败或返回空值。这不是配置漏项,而是设计限制 —— Redis 支持必须手动实现接口并注册。
必须自己实现 cache.Cache 接口
核心是实现 Get、Set、Delete、Clear 四个方法,并用 cache.SetCache 替换默认实例。推荐在 app/init.go 的 init() 函数末尾注册:
cache.SetCache(&RedisCache{
client: redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "",
DB: 0,
}),
})
-
RedisCache需嵌入*redis.Client或持有其指针,避免每次调用都新建连接 - 所有方法必须处理 context(如
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)),防止 Redis 挂掉拖垮整个请求 -
Set(key, value, expiry)中的expiry是time.Duration,需转为time.Second单位传给client.SetEX - 别忽略错误返回:Redis 连接失败时,
client.Ping(ctx).Err()会返回非 nil,应记录日志而非静默吞掉
注意 Key 命名与序列化一致性
Revel 的 cache 接口约定 value 是 interface{},但 Redis 只存字节流。你必须统一序列化方式,否则其他服务(如 Python 管理脚本)无法读取:
- 推荐用
json.Marshal存、json.Unmarshal取,避免gob(Go 专属,跨语言不可读) - Key 建议加前缀,如
"revel:" + key,避免和业务 Redis 数据混用 - 对
int、bool等基础类型,json.Marshal会转成字符串,反序列化时注意类型断言(value.(string)不总是安全) - 若 value 是结构体,确保字段首字母大写(可导出),否则
json包无法序列化内部字段
别把 Redis 当 Session 存储用
Revel 的 c.Session 和 cache 完全解耦 —— 即使你成功接入 Redis 缓存,c.Session.Save() 仍只写 Cookie,不会自动同步到 Redis。想持久化登录态或购物车数据,必须显式调用 cache.Set("sess_"+userID, data, 3600) 并在中间件中手动取回。
真正容易被忽略的是:缓存 key 的生命周期管理。比如用户登出时,仅清空 Cookie 不够,必须同步 cache.Delete("sess_" + userID);而验证码类临时数据,务必用 cache.Set("sms:verify:"+mobile, code, 300) 显式设 TTL,不能依赖 Redis 默认过期策略。


















