package common import ( "crypto/tls" "time" "github.com/RichardKnop/machinery/v1/config" "github.com/gomodule/redigo/redis" ) var ( defaultConfig = &config.RedisConfig{ MaxIdle: 3, IdleTimeout: 240, ReadTimeout: 15, WriteTimeout: 15, ConnectTimeout: 15, NormalTasksPollPeriod: 1000, DelayedTasksPollPeriod: 20, } ) // RedisConnector ... type RedisConnector struct{} // NewPool returns a new pool of Redis connections func (rc *RedisConnector) NewPool(socketPath, host, password string, db int, cnf *config.RedisConfig, tlsConfig *tls.Config) *redis.Pool { if cnf == nil { cnf = defaultConfig } return &redis.Pool{ MaxIdle: cnf.MaxIdle, IdleTimeout: time.Duration(cnf.IdleTimeout) * time.Second, MaxActive: cnf.MaxActive, Wait: cnf.Wait, Dial: func() (redis.Conn, error) { c, err := rc.open(socketPath, host, password, db, cnf, tlsConfig) if err != nil { return nil, err } if db != 0 { _, err = c.Do("SELECT", db) if err != nil { return nil, err } } return c, err }, // PINGs connections that have been idle more than 10 seconds TestOnBorrow: func(c redis.Conn, t time.Time) error { if time.Since(t) < time.Duration(10*time.Second) { return nil } _, err := c.Do("PING") return err }, } } // Open a new Redis connection func (rc *RedisConnector) open(socketPath, host, password string, db int, cnf *config.RedisConfig, tlsConfig *tls.Config) (redis.Conn, error) { var opts = []redis.DialOption{ redis.DialDatabase(db), redis.DialReadTimeout(time.Duration(cnf.ReadTimeout) * time.Second), redis.DialWriteTimeout(time.Duration(cnf.WriteTimeout) * time.Second), redis.DialConnectTimeout(time.Duration(cnf.ConnectTimeout) * time.Second), } if tlsConfig != nil { opts = append(opts, redis.DialTLSConfig(tlsConfig), redis.DialUseTLS(true)) } if password != "" { opts = append(opts, redis.DialPassword(password)) } if socketPath != "" { return redis.Dial("unix", socketPath, opts...) } return redis.Dial("tcp", host, opts...) }