Golang redis(三)redigo连接池

之前使用的是单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

你可能感兴趣的:(redis)