在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()以上就是连接池的用法了,很简单吧。