// NewCustom is like New except you can specify a DialFunc which will be // used when creating new connections for the pool. The common use-case is to do // authentication for new connections. func NewCustom(network, addr string, size int, df DialFunc) (*Pool, error) { var client *redis.Client var err error pool := make([]*redis.Client, 0, size) for i := 0; i < size; i++ { client, err = df(network, addr) if err != nil { for _, client = range pool { client.Close() } pool = pool[0:] break } pool = append(pool, client) } p := Pool{ Network: network, Addr: addr, pool: make(chan *redis.Client, len(pool)), df: df, } for i := range pool { p.pool <- pool[i] } return &p, err }
// Put returns a client back to the pool. If the pool is full the client is // closed instead. If the client is already closed (due to connection failure or // what-have-you) it will not be put back in the pool func (p *Pool) Put(conn *redis.Client) { if conn.LastCritical == nil { select { case p.pool <- conn: default: conn.Close() } } }
// Empty removes and calls Close() on all the connections currently in the pool. // Assuming there are no other connections waiting to be Put back this method // effectively closes and cleans up the pool. func (p *Pool) Empty() { var conn *redis.Client for { select { case conn = <-p.pool: conn.Close() default: return } } }
// Put putss the connection back in its pool. To be used alongside any of the // Get* methods once use of the redis.Client is done func (c *Cluster) Put(conn *redis.Client) { c.callCh <- func(c *Cluster) { p := c.pools[conn.Addr] if p == nil { conn.Close() return } p.Put(conn) } }