应初始化全局*redis.client并挂载到fiber应用生命周期,启动时调用redis.newclient()配置addr、password、db和poolsize=20,立即ping健康检查;handler中通过闭包捕获client,用get/setex操作缓存,禁止塞入c.locals或defer close。

直接用 go-redis/v9 初始化一个 *redis.Client,挂到 Fiber 应用生命周期里,在 handler 中按需读写——Fiber 本身不封装 Redis,也没有“自动集成”这回事。
别找“Fiber-Redis”中间件包
Fiber 官方没提供、也不维护任何 Redis 扩展包。所谓 fiber-redis 或 fiber-cache 类第三方库,多数已停止更新、API 不兼容 v9、或强行往 fiber.Ctx 塞 client 导致 GC 压力上升。你真正需要的只是:
-
github.com/go-redis/redis/v9(唯一推荐的客户端) - 一个全局或结构体字段持有的
*redis.Client - 在 handler 里显式调用
Get/SetEX等方法
初始化 client 并确保连接可用
启动时创建 client,不是每次请求都 new;必须做健康检查,否则服务跑着但 Redis 其实连不上:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 用
redis.NewClient(&redis.Options{Addr: "localhost:6379", Password: "", DB: 0, PoolSize: 20})初始化,PoolSize别用默认值(10),高并发下容易阻塞 -
Password字段不能留空指针——没密码也要显式设为"",否则认证失败 - 紧接着调
client.Ping(ctx).Err(),如果 err != nil 就log.Fatal,别让服务带病上线 - 不要在
app.Use(...)里初始化 client:中间件只管请求,不负责资源准备
在 handler 里安全读写缓存
别把 *redis.Client 塞进 c.Locals,闭包捕获最轻量也最可控:
- 读缓存用
client.Get(c.Context(), key).Result(),返回(string, error);判断未命中必须用errors.Is(err, redis.Nil),不是err == nil - 写缓存优先用
client.SetEX(c.Context(), key, value, ttl),比Set+Expire少一次网络往返 -
value必须是可序列化类型:存 struct 要字段首字母大写 + JSON tag;取出来是 string,得自己json.Unmarshal([]byte(s), &v) - 绝对不要在 handler 里调
defer client.Close():client 是全局复用的,关了整个服务就断连
差异化 TTL 只能靠业务逻辑控制
Fiber 没有 @Cacheable(timeToLive=300) 这种东西——Go 语言不支持运行时注解,Fiber 也不解析函数签名。TTL 差异化只能手动分支:
- 按资源类型查表:
ttlMap := map[string]time.Duration{"user": 2*time.Hour, "config": 10*time.Minute} - 或用 if/else:
if strings.HasPrefix(key, "user:") { ttl = 2*time.Hour } - 别试图封装一个“通用 cache 中间件”去自动识别业务语义——它只会增加间接层、掩盖错误、拖慢性能
最易被忽略的一点:缓存键的设计和过期时间决策,永远比 client 怎么初始化更重要。同一个业务数据,key 拼错一位、ttl 设成 1 秒或永不过期,都会导致缓存形同虚设。这些没法靠框架兜底,只能靠你在 handler 里写清楚、测明白。










