package database import ( "context" "fmt" "time" "github.com/redis/go-redis/v9" "go.uber.org/zap" ) // RedisConfig Redis 配置 type RedisConfig struct { Address string Password string DB int PoolSize int MinIdleConns int DialTimeout time.Duration ReadTimeout time.Duration WriteTimeout time.Duration } // NewRedisClient 创建新的 Redis 客户端 func NewRedisClient(cfg RedisConfig, logger *zap.Logger) (*redis.Client, error) { client := redis.NewClient(&redis.Options{ Addr: cfg.Address, Password: cfg.Password, DB: cfg.DB, PoolSize: cfg.PoolSize, MinIdleConns: cfg.MinIdleConns, DialTimeout: cfg.DialTimeout, ReadTimeout: cfg.ReadTimeout, WriteTimeout: cfg.WriteTimeout, MaxRetries: 3, PoolTimeout: 4 * time.Second, DisableIdentity: true, }) // 测试连接 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := client.Ping(ctx).Err(); err != nil { return nil, fmt.Errorf("redis连接错误: %w", err) } logger.Info("Redis 连接成功", zap.String("address", cfg.Address), zap.Int("db", cfg.DB), ) return client, nil }