今天来说下gobox中的连接池底层实现pool
为什么需要连接池
我们的系统在访问外部资源(redis、mysql等)时,为了提高性能,通常会用到的一个优化方法就是把已经使用过的tcp连接保存起来,这样当需要再次使用时,就可以直接使用了。
这样做的好处就是减少了tcp的三次握手,也就是减少了网络间的round-trip,性能可以得到很大提升。
连接池配置
type Config struct {
Size int // 最多保持多少个连接
MaxIdleTime time.Duration // 每个连接的最大空闲时间,超过会自动释放
KeepAliveInterval time.Duration // 定义每隔多长时间进行一次空闲连接保活,这是为了防止外部资源(如redis-server会设置连接超时)主动断开连接
NewConnFunc func() (IConn, error) // 从连接池中获取连接时,如果没有可用连接,会通过这个方法创建一个新连接
KeepAliveFunc func(conn IConn) error // 连接保活时对连接池的每个连接执行此方法
}
表示每个连接的接口
type IConn interface {
Free() // 关闭连接时执行此方法
}
每个使用连接池的连接,实现该接口即可。
关闭连接放生在如下几种情况:
- 连接超过最大空闲时间
- 连接池已满时再被放入的空闲连接会被释放
使用方法
import
import (
"github.com/goinbox/pool"
)
新建连接池
func NewPool(config *Config) *Pool
从连接池中获取可用连接
func (p *Pool) Get() (IConn, error)
该方法为非阻塞方法,获取连接时若当前连接池中无可用连接,会调用config中配置的NewConnFunc方法新创建一个连接。
把空闲连接放回连接池
func (p *Pool) Put(conn IConn) error
该方法为非阻塞方法,放置空闲连接时若当前连接池已满,则会自动释放该空闲连接。
欢迎大家使用,使用中有遇到问题随时反馈,我们会尽快响应,谢谢!
网友评论