NewRedis() 调用前须确保配置已加载、连接池已初始化,否则 Get/Set 会 panic 或返回空值;需检查 redis.Config 字段完整(Network="tcp"、Addr="127.0.0.1:6379"、Password匹配、IdleTimeout≥5min),调用后立即 Ping 验证连接,全局复用 client 并 defer Close()。

直接连就行,但必须确认 NewRedis() 调用前配置已加载、连接池已初始化,否则 Get 或 Set 会 panic 或返回空值。
检查 redis.Config 是否完整初始化
iris 的 redis 包(如 github.com/kataras/iris/v12/cache/redis 或项目自定义封装)依赖 redis.Config 结构体。缺字段或字段为空会导致连接失败,常见表现是 redis: nil pointer dereference 或超时无响应。
-
Network必须是"tcp"(Unix socket 少见,不建议初试) -
Addr格式必须为"127.0.0.1:6379",不能漏端口、不能带redis://前缀 -
Password为空字符串""表示无密码;若 Redis 配了 requirepass,这里必须严格匹配,区分大小写 -
IdleTimeout建议设为time.Minute * 5以上,太短会导致连接频繁重建,time.Second * 30容易触发read: connection timed out
确保 NewRedis 返回的 client 可复用且带连接池
iris 本身不内置 Redis client,通常用 github.com/go-redis/redis/v8 封装。调用 NewRedis 后必须验证 client 是否 ready,不能只看 err == nil。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 在
main.go初始化后立即执行一次client.Ping(ctx).Err(),捕获真实连接状态 - 不要每次请求都
new一个 client —— iris-admin 里auth2/redis.go是单例模式,全局复用一个*redis.Client - 如果用了连接池(如
redis.NewClient默认带 pool),需确认PoolSize不小于并发峰值,否则会出现connection pool exhausted - Go mod 中版本要对齐:iris v12 项目推荐用
github.com/go-redis/redis/v8 v8.11.5+,v9+ 有 API 断层
缓存读写必须处理 context 和 error,不能忽略超时与序列化
iris 场景下缓存常用于 token、用户权限、接口结果,Get/Set 若不带 context 或没检查 error,线上容易静默失败。
-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)—— 必须设 timeout,Redis 延迟突增时不会卡住整个 HTTP 请求 -
Set时避免传 raw struct,优先用json.Marshal后存 string,或用redis.JSONSet(需服务端 RedisJSON 模块) -
Get返回Val()前务必err == nil,空值也要显式判断:if val, err := client.Get(ctx, key).Result(); err == redis.Nil { /* 未命中 */ } else if err != nil { /* 真实错误 */ } - Key 命名建议加前缀,如
"user:token:" + userID,避免和 session、stat 等其他模块冲突
最常被跳过的一步:没在 main() 里 defer client.Close(),导致进程退出时连接泄漏,下次启动因 TIME_WAIT 太多连不上。这个细节在本地测不出问题,压测或滚动发布时才暴露。

















