之前使用的是单connection, 在实际应用中经常需要使用到连接池的功能
但是redigo对于连接池支持稍弱
应用程序调用Get方法从池中获取连接,并使用连接的Close方法将连接的资源返回到池。
提供方法:
1.func NewPool
创建新池 备注: 该方法将会在后面的版本移除,不建议使用
2.func (*Pool) ActiveCount
返回active的连接数,包含空闲的和正在使用的
3.func (*Pool) Close
关闭连接
4.func (*Pool) Get
获取一个连接
5.func (*Pool) GetContext
GetContext使用提供的上下文获取连接
6.func (*Pool) IdleCount
空闲连接数
7.func (*Pool) Stats
连接池统计信息
例如:
func newPool(addr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
// Dial or DialContext must be set. When both are set, DialContext takes precedence over Dial.
Dial: func () (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
}
var (
pool *redis.Pool
redisServer = flag.String("127.0.0.1", ":6379", "")
)
func main() {
flag.Parse()
pool = newPool(*redisServer)
...
}
应用程序使用如下:
func serveHome(w http.ResponseWriter, r *http.Request) {
conn := pool.Get()
defer conn.Close()
...
}
使用Dial功能验证与AUTH命令的连接,或使用SELECT命令选择数据库
pool := &redis.Pool{
// Other pool configuration not shown in this example.
Dial: func () (redis.Conn, error) {
c, err := redis.Dial("tcp", server)
if err != nil {
return nil, err
}
if _, err := c.Do("AUTH", password); err != nil {
c.Close()
return nil, err
}
if _, err := c.Do("SELECT", db); err != nil {
c.Close()
return nil, err
}
return c, nil
},
}
使用TestOnBorrow函数检查空闲连接的运行状况
pool := &redis.Pool{
// Other pool configuration not shown in this example.
TestOnBorrow: func(c redis.Conn, t time.Time) error {
if time.Since(t) < time.Minute {
return nil
}
_, err := c.Do("PING")
return err
},
}
示例:
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
"time"
"flag"
)
var (
pool *redis.Pool
//redisServer = flag.String("127.0.0.1", ":6379", "")
)
func newPool(addr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
// Dial or DialContext must be set. When both are set, DialContext takes precedence over Dial.
Dial: func () (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
}
func Get() redis.Conn {
return pool.Get()
}
func main() {
flag.Parse()
pool = newPool("127.0.0.1:6379")
connections := pool.Get()
defer connections.Close()
set_res, err := connections.Do("SET", "new_test", "redigo")
if err != nil {
fmt.Println("err while set key :", err)
}else {
fmt.Println(set_res)
}
is_exists, err := redis.Bool(connections.Do("EXISTS", "new_test"))
if err != nil {
fmt.Println(err)
} else {
fmt.Println(is_exists)
}
get_res, err := redis.String(connections.Do("GET", "new_test"))
if err != nil {
fmt.Println("get err:", err)
} else {
fmt.Println(get_res)
}
}
输出:
OK
true
redigo