1. 程式人生 > >Redigo--用池管理redis連線

Redigo--用池管理redis連線

在golang的專案中,若要頻繁的用redis(或者其他類似的NoSQL)來存取資料,最好用redigo自帶的池來管理連線。

不然的話,每當要操作redis時,建立連線,用完後再關閉,會導致大量的連線處於TIME_WAIT狀態(redis連線本質上就是tcp)。

注:TIME_WAIT,也叫TCP半連線狀態,會繼續佔用本地埠。

以下為redis連線池的golang實現:

import (
	"github.com/garyburd/redigo/redis"
	"github.com/astaxie/beego"
	"time"
)

var (
	// 定義常量
	RedisClient     *redis.Pool
	REDIS_HOST string
	REDIS_DB   int
)

func init() {
	// 從配置檔案獲取redis的ip以及db
	REDIS_HOST = beego.AppConfig.String("redis.host")
	REDIS_DB, _ = beego.AppConfig.Int("redis.db")
	// 建立連線池
	RedisClient = &redis.Pool{
		// 從配置檔案獲取maxidle以及maxactive,取不到則用後面的預設值
		MaxIdle:     beego.AppConfig.DefaultInt("redis.maxidle", 1),
		MaxActive:   beego.AppConfig.DefaultInt("redis.maxactive", 10),
		IdleTimeout: 180 * time.Second,
		Dial: func() (redis.Conn, error) {
			c, err := redis.Dial("tcp", REDIS_HOST)
			if err != nil {
				return nil, err
			}
			// 選擇db
			c.Do("SELECT", REDIS_DB)
			return c, nil
		},
	}
}
其中,各引數的解釋如下:

MaxIdle:最大的空閒連線數,表示即使沒有redis連線時依然可以保持N個空閒的連線,而不被清除,隨時處於待命狀態。

MaxActive:最大的啟用連線數,表示同時最多有N個連線

IdleTimeout:最大的空閒連線等待時間,超過此時間後,空閒連線將被關閉

Dial:建立連線

使用連線池時的程式碼:

// 從池裡獲取連線
rc := RedisClient.Get()
// 用完後將連線放回連線池
defer rc.Close()
以上就是連線池的用法了,很簡單吧。