必须调用 iris.registerredis(cfg) 显式注册配置,且在 app.run() 前执行一次;cfg.password 为空需设为 nil,idletimeout 建议 5 分钟,acl 模式下填 "user:pass" 格式。

直接用 iris.Redis() 获取实例就能操作,不用自己封装连接池或重写 SET/GET —— Iris 内置的 Redis 客户端已自动管理连接复用和错误重试。
怎么初始化 Redis 连接(不是配 config.json 就完事)
Iris 的 redis.Config 只是结构体,真正生效要靠 iris.RegisterRedis() 显式注册。漏掉这步,iris.Redis() 会 panic 或返回 nil。
- 必须在
app.Run()前调用iris.RegisterRedis(cfg),且只调用一次 -
cfg.Password为空时不能传"",得设为nil(否则某些版本会误判为密码是空字符串) -
cfg.IdleTimeout建议设为5 * time.Minute而非 24 小时:长连接在云环境易被 NAT 超时断开,反而触发重建开销 - 如果 Redis 启用了 ACL(如 Redis 6+),
cfg.Password应填用户名+密码拼接的字符串,格式为"default:mypassword"
缓存读写怎么避免踩空指针和类型错乱
Iris 的 redis.Client 是基于 github.com/go-redis/redis/v8 封装的,所有方法都带 context.Context,但默认不设超时 —— 这会导致阻塞整个 goroutine。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 所有
Get/Set必须传带超时的 context,比如ctx, cancel := context.WithTimeout(r.Context(), 100*time.Millisecond) -
Get返回的是*redis.StringCmd,不能直接当 string 用:val, err := client.Get(ctx, key).Result()才拿到真实值 - 存 struct 时别直接
Set(ctx, key, myStruct, ttl)—— Iris 不自动序列化,得先用json.Marshal转成[]byte - 用
Prefix配置后,Keys("user:*")会查不到数据,因为实际 key 是prefix:user:123,得用Keys("prefix:user:*")
为什么 SetNX 加锁总失败,但 SET key val EX 10 NX 手动执行却成功
Iris 的 SetNX 方法底层调的是 SET key val NX EX 10,但参数顺序和 Redis CLI 不同:它把过期时间放在第 4 位,而 CLI 是 EX 后紧跟秒数。容易混淆导致命令被拒绝。
- 正确用法:
client.SetNX(ctx, key, value, 10*time.Second).Val()—— 第 4 参数是time.Duration,不是整数秒 - 如果需要更细粒度控制(比如加锁失败时返回当前 TTL),改用
Do(ctx, "SET", key, value, "NX", "EX", 10).Val() - 注意:Iris 的
SetNX在 key 已存在时不报错,而是返回false;但如果你依赖返回值做逻辑分支,得检查err == nil && ok == true,不能只看 err
最常被忽略的是 context 超时和 Prefix 行为 —— 它们不会报错,但会让缓存命中率骤降或锁永远不释放,问题现象模糊,排查成本远高于初始化时多写两行代码。










