mirror of
https://github.com/redis/go-redis.git
synced 2025-04-19 07:22:17 +03:00
Allow FIFO pool in redis client (#1820)
* Initial commit for FIFO pool * Change PoolType string to PoolFIFO bool * Remove redundant type * add PoolFIFO option to all clients Signed-off-by: monkey92t <golang@88.com> Co-authored-by: Kim Tae Kwon <taekwon.kim@shopee.com> Co-authored-by: monkey92t <golang@88.com>
This commit is contained in:
parent
247c62ad92
commit
ce40cd942a
@ -68,6 +68,9 @@ type ClusterOptions struct {
|
|||||||
ReadTimeout time.Duration
|
ReadTimeout time.Duration
|
||||||
WriteTimeout time.Duration
|
WriteTimeout time.Duration
|
||||||
|
|
||||||
|
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
|
||||||
|
PoolFIFO bool
|
||||||
|
|
||||||
// PoolSize applies per cluster node and not for the whole cluster.
|
// PoolSize applies per cluster node and not for the whole cluster.
|
||||||
PoolSize int
|
PoolSize int
|
||||||
MinIdleConns int
|
MinIdleConns int
|
||||||
@ -146,6 +149,7 @@ func (opt *ClusterOptions) clientOptions() *Options {
|
|||||||
ReadTimeout: opt.ReadTimeout,
|
ReadTimeout: opt.ReadTimeout,
|
||||||
WriteTimeout: opt.WriteTimeout,
|
WriteTimeout: opt.WriteTimeout,
|
||||||
|
|
||||||
|
PoolFIFO: opt.PoolFIFO,
|
||||||
PoolSize: opt.PoolSize,
|
PoolSize: opt.PoolSize,
|
||||||
MinIdleConns: opt.MinIdleConns,
|
MinIdleConns: opt.MinIdleConns,
|
||||||
MaxConnAge: opt.MaxConnAge,
|
MaxConnAge: opt.MaxConnAge,
|
||||||
|
@ -57,6 +57,7 @@ type Options struct {
|
|||||||
Dialer func(context.Context) (net.Conn, error)
|
Dialer func(context.Context) (net.Conn, error)
|
||||||
OnClose func(*Conn) error
|
OnClose func(*Conn) error
|
||||||
|
|
||||||
|
PoolFIFO bool
|
||||||
PoolSize int
|
PoolSize int
|
||||||
MinIdleConns int
|
MinIdleConns int
|
||||||
MaxConnAge time.Duration
|
MaxConnAge time.Duration
|
||||||
@ -308,13 +309,21 @@ func (p *ConnPool) freeTurn() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *ConnPool) popIdle() *Conn {
|
func (p *ConnPool) popIdle() *Conn {
|
||||||
if len(p.idleConns) == 0 {
|
n := len(p.idleConns)
|
||||||
|
if n == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
idx := len(p.idleConns) - 1
|
var cn *Conn
|
||||||
cn := p.idleConns[idx]
|
if p.opt.PoolFIFO {
|
||||||
|
cn = p.idleConns[0]
|
||||||
|
copy(p.idleConns, p.idleConns[1:])
|
||||||
|
p.idleConns = p.idleConns[:n-1]
|
||||||
|
} else {
|
||||||
|
idx := n - 1
|
||||||
|
cn = p.idleConns[idx]
|
||||||
p.idleConns = p.idleConns[:idx]
|
p.idleConns = p.idleConns[:idx]
|
||||||
|
}
|
||||||
p.idleConnsLen--
|
p.idleConnsLen--
|
||||||
p.checkMinIdleConns()
|
p.checkMinIdleConns()
|
||||||
return cn
|
return cn
|
||||||
|
@ -76,6 +76,10 @@ type Options struct {
|
|||||||
// Default is ReadTimeout.
|
// Default is ReadTimeout.
|
||||||
WriteTimeout time.Duration
|
WriteTimeout time.Duration
|
||||||
|
|
||||||
|
// Type of connection pool.
|
||||||
|
// true for FIFO pool, false for LIFO pool.
|
||||||
|
// Note that fifo has higher overhead compared to lifo.
|
||||||
|
PoolFIFO bool
|
||||||
// Maximum number of socket connections.
|
// Maximum number of socket connections.
|
||||||
// Default is 10 connections per every available CPU as reported by runtime.GOMAXPROCS.
|
// Default is 10 connections per every available CPU as reported by runtime.GOMAXPROCS.
|
||||||
PoolSize int
|
PoolSize int
|
||||||
@ -291,6 +295,7 @@ func newConnPool(opt *Options) *pool.ConnPool {
|
|||||||
Dialer: func(ctx context.Context) (net.Conn, error) {
|
Dialer: func(ctx context.Context) (net.Conn, error) {
|
||||||
return opt.Dialer(ctx, opt.Network, opt.Addr)
|
return opt.Dialer(ctx, opt.Network, opt.Addr)
|
||||||
},
|
},
|
||||||
|
PoolFIFO: opt.PoolFIFO,
|
||||||
PoolSize: opt.PoolSize,
|
PoolSize: opt.PoolSize,
|
||||||
MinIdleConns: opt.MinIdleConns,
|
MinIdleConns: opt.MinIdleConns,
|
||||||
MaxConnAge: opt.MaxConnAge,
|
MaxConnAge: opt.MaxConnAge,
|
||||||
|
4
ring.go
4
ring.go
@ -78,6 +78,9 @@ type RingOptions struct {
|
|||||||
ReadTimeout time.Duration
|
ReadTimeout time.Duration
|
||||||
WriteTimeout time.Duration
|
WriteTimeout time.Duration
|
||||||
|
|
||||||
|
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
|
||||||
|
PoolFIFO bool
|
||||||
|
|
||||||
PoolSize int
|
PoolSize int
|
||||||
MinIdleConns int
|
MinIdleConns int
|
||||||
MaxConnAge time.Duration
|
MaxConnAge time.Duration
|
||||||
@ -138,6 +141,7 @@ func (opt *RingOptions) clientOptions() *Options {
|
|||||||
ReadTimeout: opt.ReadTimeout,
|
ReadTimeout: opt.ReadTimeout,
|
||||||
WriteTimeout: opt.WriteTimeout,
|
WriteTimeout: opt.WriteTimeout,
|
||||||
|
|
||||||
|
PoolFIFO: opt.PoolFIFO,
|
||||||
PoolSize: opt.PoolSize,
|
PoolSize: opt.PoolSize,
|
||||||
MinIdleConns: opt.MinIdleConns,
|
MinIdleConns: opt.MinIdleConns,
|
||||||
MaxConnAge: opt.MaxConnAge,
|
MaxConnAge: opt.MaxConnAge,
|
||||||
|
@ -57,6 +57,9 @@ type FailoverOptions struct {
|
|||||||
ReadTimeout time.Duration
|
ReadTimeout time.Duration
|
||||||
WriteTimeout time.Duration
|
WriteTimeout time.Duration
|
||||||
|
|
||||||
|
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
|
||||||
|
PoolFIFO bool
|
||||||
|
|
||||||
PoolSize int
|
PoolSize int
|
||||||
MinIdleConns int
|
MinIdleConns int
|
||||||
MaxConnAge time.Duration
|
MaxConnAge time.Duration
|
||||||
@ -86,6 +89,7 @@ func (opt *FailoverOptions) clientOptions() *Options {
|
|||||||
ReadTimeout: opt.ReadTimeout,
|
ReadTimeout: opt.ReadTimeout,
|
||||||
WriteTimeout: opt.WriteTimeout,
|
WriteTimeout: opt.WriteTimeout,
|
||||||
|
|
||||||
|
PoolFIFO: opt.PoolFIFO,
|
||||||
PoolSize: opt.PoolSize,
|
PoolSize: opt.PoolSize,
|
||||||
PoolTimeout: opt.PoolTimeout,
|
PoolTimeout: opt.PoolTimeout,
|
||||||
IdleTimeout: opt.IdleTimeout,
|
IdleTimeout: opt.IdleTimeout,
|
||||||
@ -115,6 +119,7 @@ func (opt *FailoverOptions) sentinelOptions(addr string) *Options {
|
|||||||
ReadTimeout: opt.ReadTimeout,
|
ReadTimeout: opt.ReadTimeout,
|
||||||
WriteTimeout: opt.WriteTimeout,
|
WriteTimeout: opt.WriteTimeout,
|
||||||
|
|
||||||
|
PoolFIFO: opt.PoolFIFO,
|
||||||
PoolSize: opt.PoolSize,
|
PoolSize: opt.PoolSize,
|
||||||
PoolTimeout: opt.PoolTimeout,
|
PoolTimeout: opt.PoolTimeout,
|
||||||
IdleTimeout: opt.IdleTimeout,
|
IdleTimeout: opt.IdleTimeout,
|
||||||
@ -146,6 +151,7 @@ func (opt *FailoverOptions) clusterOptions() *ClusterOptions {
|
|||||||
ReadTimeout: opt.ReadTimeout,
|
ReadTimeout: opt.ReadTimeout,
|
||||||
WriteTimeout: opt.WriteTimeout,
|
WriteTimeout: opt.WriteTimeout,
|
||||||
|
|
||||||
|
PoolFIFO: opt.PoolFIFO,
|
||||||
PoolSize: opt.PoolSize,
|
PoolSize: opt.PoolSize,
|
||||||
PoolTimeout: opt.PoolTimeout,
|
PoolTimeout: opt.PoolTimeout,
|
||||||
IdleTimeout: opt.IdleTimeout,
|
IdleTimeout: opt.IdleTimeout,
|
||||||
|
@ -35,6 +35,9 @@ type UniversalOptions struct {
|
|||||||
ReadTimeout time.Duration
|
ReadTimeout time.Duration
|
||||||
WriteTimeout time.Duration
|
WriteTimeout time.Duration
|
||||||
|
|
||||||
|
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
|
||||||
|
PoolFIFO bool
|
||||||
|
|
||||||
PoolSize int
|
PoolSize int
|
||||||
MinIdleConns int
|
MinIdleConns int
|
||||||
MaxConnAge time.Duration
|
MaxConnAge time.Duration
|
||||||
@ -83,6 +86,7 @@ func (o *UniversalOptions) Cluster() *ClusterOptions {
|
|||||||
DialTimeout: o.DialTimeout,
|
DialTimeout: o.DialTimeout,
|
||||||
ReadTimeout: o.ReadTimeout,
|
ReadTimeout: o.ReadTimeout,
|
||||||
WriteTimeout: o.WriteTimeout,
|
WriteTimeout: o.WriteTimeout,
|
||||||
|
PoolFIFO: o.PoolFIFO,
|
||||||
PoolSize: o.PoolSize,
|
PoolSize: o.PoolSize,
|
||||||
MinIdleConns: o.MinIdleConns,
|
MinIdleConns: o.MinIdleConns,
|
||||||
MaxConnAge: o.MaxConnAge,
|
MaxConnAge: o.MaxConnAge,
|
||||||
@ -120,6 +124,7 @@ func (o *UniversalOptions) Failover() *FailoverOptions {
|
|||||||
ReadTimeout: o.ReadTimeout,
|
ReadTimeout: o.ReadTimeout,
|
||||||
WriteTimeout: o.WriteTimeout,
|
WriteTimeout: o.WriteTimeout,
|
||||||
|
|
||||||
|
PoolFIFO: o.PoolFIFO,
|
||||||
PoolSize: o.PoolSize,
|
PoolSize: o.PoolSize,
|
||||||
MinIdleConns: o.MinIdleConns,
|
MinIdleConns: o.MinIdleConns,
|
||||||
MaxConnAge: o.MaxConnAge,
|
MaxConnAge: o.MaxConnAge,
|
||||||
@ -155,6 +160,7 @@ func (o *UniversalOptions) Simple() *Options {
|
|||||||
ReadTimeout: o.ReadTimeout,
|
ReadTimeout: o.ReadTimeout,
|
||||||
WriteTimeout: o.WriteTimeout,
|
WriteTimeout: o.WriteTimeout,
|
||||||
|
|
||||||
|
PoolFIFO: o.PoolFIFO,
|
||||||
PoolSize: o.PoolSize,
|
PoolSize: o.PoolSize,
|
||||||
MinIdleConns: o.MinIdleConns,
|
MinIdleConns: o.MinIdleConns,
|
||||||
MaxConnAge: o.MaxConnAge,
|
MaxConnAge: o.MaxConnAge,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user