gobox中的連接池pool

今天來說下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()     // 關閉連接時執行此方法
}

每個使用連接池的連接,實現該接口即可。

關閉連接放生在如下幾種情況:

  1. 連接超過最大空閑時間
  2. 連接池已滿時再被放入的空閑連接會被釋放

使用方法

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

該方法為非阻塞方法,放置空閑連接時若當前連接池已滿,則會自動釋放該空閑連接。

歡迎大家使用,使用中有遇到問題隨時反饋,我們會盡快響應,謝謝!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容