code: func NewRedisCache(host string, password string, defaultExpiration time.Duration) RedisCache {
  	var pool = &redis.Pool{
  		MaxIdle:     revel.Config.IntDefault("cache.redis.maxidle", 5),
  		MaxActive:   revel.Config.IntDefault("cache.redis.maxactive", 0),
  		IdleTimeout: time.Duration(revel.Config.IntDefault("cache.redis.idletimeout", 240)) * time.Second,
  		Dial: func() (redis.Conn, error) {
  			protocol := revel.Config.StringDefault("cache.redis.protocol", "tcp")
  			toc := time.Millisecond * time.Duration(revel.Config.IntDefault("cache.redis.timeout.connect", 10000))
  			tor := time.Millisecond * time.Duration(revel.Config.IntDefault("cache.redis.timeout.read", 5000))
  			tow := time.Millisecond * time.Duration(revel.Config.IntDefault("cache.redis.timeout.write", 5000))
  			c, err := redis.Dial(protocol, host,
  				redis.DialConnectTimeout(toc),
  				redis.DialReadTimeout(tor),
  				redis.DialWriteTimeout(tow))
  			if err != nil {
  				return nil, err
  			}
  			if len(password) > 0 {
  				if _, err = c.Do("AUTH", password); err != nil {
  					_ = c.Close()
  					return nil, err
  				}
  			} else {
  				// check with PING
  				if _, err = c.Do("PING"); err != nil {
  					_ = c.Close()
  					return nil, err
  				}
  			}
  			return c, err
  		},
  		// custom connection test method
  		TestOnBorrow: func(c redis.Conn, t time.Time) error {
  			_, err := c.Do("PING")
  			return err
  		},
  	}
  	return RedisCache{pool, defaultExpiration}
  }
docs: // NewRedisCache returns a new RedisCache with given parameters
  // until redigo supports sharding/clustering, only one host will be in hostList