forked from mirror/redis
114 lines
2.9 KiB
Go
114 lines
2.9 KiB
Go
package redis
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
|
|
"gopkg.in/redis.v4/internal/pool"
|
|
)
|
|
|
|
type Options struct {
|
|
// The network type, either tcp or unix.
|
|
// Default is tcp.
|
|
Network string
|
|
// host:port address.
|
|
Addr string
|
|
|
|
// Dialer creates new network connection and has priority over
|
|
// Network and Addr options.
|
|
Dialer func() (net.Conn, error)
|
|
|
|
// Optional password. Must match the password specified in the
|
|
// requirepass server configuration option.
|
|
Password string
|
|
// Database to be selected after connecting to the server.
|
|
DB int
|
|
|
|
// Maximum number of retries before giving up.
|
|
// Default is to not retry failed commands.
|
|
MaxRetries int
|
|
|
|
// Dial timeout for establishing new connections.
|
|
// Default is 5 seconds.
|
|
DialTimeout time.Duration
|
|
// Timeout for socket reads. If reached, commands will fail
|
|
// with a timeout instead of blocking.
|
|
// Default is 3 seconds.
|
|
ReadTimeout time.Duration
|
|
// Timeout for socket writes. If reached, commands will fail
|
|
// with a timeout instead of blocking.
|
|
// Default is 3 seconds.
|
|
WriteTimeout time.Duration
|
|
|
|
// Maximum number of socket connections.
|
|
// Default is 10 connections.
|
|
PoolSize int
|
|
// Amount of time client waits for connection if all connections
|
|
// are busy before returning an error.
|
|
// Default is ReadTimeout + 1 second.
|
|
PoolTimeout time.Duration
|
|
// Amount of time after which client closes idle connections.
|
|
// Should be less than server's timeout.
|
|
// Default is to not close idle connections.
|
|
IdleTimeout time.Duration
|
|
// Frequency of idle checks.
|
|
// Default is 1 minute.
|
|
// When minus value is set, then idle check is disabled.
|
|
IdleCheckFrequency time.Duration
|
|
|
|
// Enables read only queries on slave nodes.
|
|
ReadOnly bool
|
|
}
|
|
|
|
func (opt *Options) init() {
|
|
if opt.Network == "" {
|
|
opt.Network = "tcp"
|
|
}
|
|
if opt.Dialer == nil {
|
|
opt.Dialer = func() (net.Conn, error) {
|
|
return net.DialTimeout(opt.Network, opt.Addr, opt.DialTimeout)
|
|
}
|
|
}
|
|
if opt.PoolSize == 0 {
|
|
opt.PoolSize = 10
|
|
}
|
|
if opt.DialTimeout == 0 {
|
|
opt.DialTimeout = 5 * time.Second
|
|
}
|
|
if opt.ReadTimeout == 0 {
|
|
opt.ReadTimeout = 3 * time.Second
|
|
}
|
|
if opt.WriteTimeout == 0 {
|
|
opt.WriteTimeout = opt.ReadTimeout
|
|
}
|
|
if opt.PoolTimeout == 0 {
|
|
opt.PoolTimeout = opt.ReadTimeout + time.Second
|
|
}
|
|
if opt.IdleTimeout == 0 {
|
|
opt.IdleTimeout = 5 * time.Minute
|
|
}
|
|
if opt.IdleCheckFrequency == 0 {
|
|
opt.IdleCheckFrequency = time.Minute
|
|
}
|
|
}
|
|
|
|
func newConnPool(opt *Options) *pool.ConnPool {
|
|
return pool.NewConnPool(
|
|
opt.Dialer,
|
|
opt.PoolSize,
|
|
opt.PoolTimeout,
|
|
opt.IdleTimeout,
|
|
opt.IdleCheckFrequency,
|
|
)
|
|
}
|
|
|
|
// PoolStats contains pool state information and accumulated stats.
|
|
type PoolStats struct {
|
|
Requests uint32 // number of times a connection was requested by the pool
|
|
Hits uint32 // number of times free connection was found in the pool
|
|
Timeouts uint32 // number of times a wait timeout occurred
|
|
|
|
TotalConns uint32 // the number of total connections in the pool
|
|
FreeConns uint32 // the number of free connections in the pool
|
|
}
|