今天來說下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
該方法為非阻塞方法,放置空閑連接時若當前連接池已滿,則會自動釋放該空閑連接。
歡迎大家使用,使用中有遇到問題隨時反饋,我們會盡快響應,謝謝!