code: func NewPoolWithOptions(options PoolOptions) *Pool {
  	pool := &Pool{
  		options:         options,
  		modelTypeToSpec: map[reflect.Type]*modelSpec{},
  		modelNameToSpec: map[string]*modelSpec{},
  	}
  	pool.redisPool = &redis.Pool{
  		MaxIdle:     options.MaxIdle,
  		MaxActive:   options.MaxActive,
  		IdleTimeout: options.IdleTimeout,
  		Wait:        options.Wait,
  		Dial: func() (redis.Conn, error) {
  			c, err := redis.Dial(options.Network, options.Address)
  			if err != nil {
  				return nil, err
  			}
  			// If a options.Password was provided, use the AUTH command to authenticate
  			if options.Password != "" {
  				if _, err := c.Do("AUTH", options.Password); err != nil {
  					return nil, err
  				}
  			}
  			// Select the database number provided by options.Database
  			if _, err := c.Do("Select", options.Database); err != nil {
  				_ = c.Close()
  				return nil, err
  			}
  			return c, err
  		},
  	}
  	return pool
  }
docs: // NewPoolWithOptions initializes and returns a pool with the given options. You
  // can pass in DefaultOptions to use all the default options. Or cal the WithX
  // methods of DefaultOptions to change the options you want to change.