go-redis/v9是redis官方维护的go客户端,功能完备:支持全部redis命令(除quit/sync)、自动连接池、pub/sub、pipeline/事务、lua脚本、sentinel/cluster、客户端缓存等。

直接用 go-redis,别找“Fiber-Redis”扩展——Fiber 本身不封装 Redis,所有连接和操作都依赖 github.com/go-redis/redis/v9。 官方没提供 Fiber 专用的 Redis 扩展包,强行找“Fiber-Redis”只会引入过时、维护差或功能残缺的第三方包。
怎么初始化 go-redis 并挂到 Fiber App 上
不能把 redis.Client 实例写死在 handler 里,也不能每次请求都新建 client。正确做法是:在应用启动时创建带连接池的 redis.Client,然后通过 app.Get("redis", ...) 或更推荐的方式——用结构体字段或全局变量持有它(Fiber 没强制要求依赖注入)。
- 用
redis.NewClient()初始化,传入&redis.Options{Addr: "localhost:6379", Password: "", DB: 0};若 Redis 有密码,Password字段必须显式填空字符串或真实密码,留空会导致认证失败 - 务必设置
PoolSize: 20(中小型服务够用),不设的话默认是 10,高并发下容易阻塞 - 加一层健康检查:启动后立即调用
client.Ping(ctx).Err(),失败就log.Fatal,别让服务带着断连状态跑起来 - Fiber 的
app.Use中间件不适合放 Redis 初始化逻辑;它只处理 HTTP 请求生命周期,而 Redis 连接属于应用级资源
在 Handler 里安全读写缓存的写法
Fiber 的 ctx 是请求上下文,不自带 Redis 实例。你需要从外部把 *redis.Client 传进去——最轻量的方式是闭包捕获,而不是往 ctx.Locals 塞 client(会增加 GC 压力且无必要)。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 写缓存用
client.Set(ctx, key, value, ttl),注意value必须是可序列化的 Go 值(string、int、struct等),struct要求字段首字母大写且有 JSON tag - 读缓存用
client.Get(ctx, key).Result(),返回(string, error);如果 key 不存在,error 是redis.Nil,不是nil,必须用errors.Is(err, redis.Nil)判断 - 避免直接对
interface{}调Get().Result(),比如client.Get(ctx, "user:123").Result()返回的是string,但你存的是json.Marshal(user),那取出来得自己json.Unmarshal([]byte(s), &user) - 不要在 handler 里用
defer client.Close()——client 是复用的,关了就全挂了
常见报错和对应解法
连不上、读出来是空、写不进去——这些问题基本都集中在配置和类型处理上,不是 Fiber 的锅。
-
redis: connection refused:Redis 服务根本没起来,或地址/端口写错;先用redis-cli -h localhost -p 6379 ping确认服务可达 -
redis: nil被当成真实错误:没做errors.Is(err, redis.Nil)判断,直接 panic 或返回 500,实际应视为“缓存未命中”,走 DB 查询逻辑 - 存 struct 后读出来是空对象:没检查
json.Marshal是否出错,或json.Unmarshal时目标变量没取地址(&user写成user) - 大量
context deadline exceeded:网络延迟高或 Redis 响应慢,调大Context的 timeout(比如用context.WithTimeout(ctx, 500*time.Millisecond)),别用context.Background()
真正难的不是连上 Redis,而是 key 设计、空值穿透、缓存击穿这些业务层问题——Fiber 和 go-redis 只负责把命令发过去,剩下的得你自己兜底。










