Files
gin-vue-admin/server/initialize/redis.go
T
xuedinge 98ca3dbc79 server/config/redis.go: Redis 支持配置 username,兼容云 Redis 自定义 ACL 账号
云厂商(阿里云等)的 Redis 实例使用自定义 ACL 账号时,要求客户端以
AUTH <username> <password> 双参数方式进行鉴权。当前代码在初始化
go-redis 客户端时从未设置 Username,只会发送单参数 AUTH <password>,
连接此类实例时 Ping 报错 WRONGPASS,导致服务启动失败(panic)。

- config.Redis 新增 username 配置项
- initialize/redis.go 单机与集群两种模式的客户端初始化均传入 Username

使用默认账号或本地 Redis 时 username 留空即可,行为与原有版本完全
一致(go-redis 在 Username 为空时只发送单参数 AUTH)。

Fix #2264
2026-09-20 01:49:31 +08:00

62 lines
1.5 KiB
Go

package initialize
import (
"context"
"github.com/flipped-aurora/gin-vue-admin/server/config"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/redis/go-redis/v9"
"go.uber.org/zap"
)
func initRedisClient(redisCfg config.Redis) (redis.UniversalClient, error) {
var client redis.UniversalClient
// 使用集群模式
if redisCfg.UseCluster {
client = redis.NewClusterClient(&redis.ClusterOptions{
Addrs: redisCfg.ClusterAddrs,
Username: redisCfg.Username,
Password: redisCfg.Password,
})
} else {
// 使用单例模式
client = redis.NewClient(&redis.Options{
Addr: redisCfg.Addr,
Username: redisCfg.Username,
Password: redisCfg.Password,
DB: redisCfg.DB,
})
}
pong, err := client.Ping(context.Background()).Result()
if err != nil {
global.GVA_LOG.Error("redis connect ping failed, err:", zap.String("name", redisCfg.Name), zap.Error(err))
return nil, err
}
global.GVA_LOG.Info("redis connect ping response:", zap.String("name", redisCfg.Name), zap.String("pong", pong))
return client, nil
}
func Redis() {
redisClient, err := initRedisClient(global.GVA_CONFIG.Redis)
if err != nil {
panic(err)
}
global.GVA_REDIS = redisClient
}
func RedisList() {
redisMap := make(map[string]redis.UniversalClient)
for _, redisCfg := range global.GVA_CONFIG.RedisList {
client, err := initRedisClient(redisCfg)
if err != nil {
panic(err)
}
redisMap[redisCfg.Name] = client
}
global.GVA_REDISList = redisMap
}