120 lines
3.3 KiB
Plaintext
120 lines
3.3 KiB
Plaintext
/*
|
||
redisUtil对Redis的连接池进行了一定程度的封装
|
||
将常用的方法进行了内部封装,对于不常见的方法,有两种处理方式:
|
||
1、向作者提出请求,由作者添加到代码中
|
||
2、调用GetConnection方法,然后自己实现逻辑
|
||
在代码中,统一将conn.Do的结果和redis.Int,redis.String等类型转换合并处理
|
||
|
||
redis的命令请参考:https://redis.readthedocs.io/en/2.6/index.html
|
||
*/
|
||
package redisUtil
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
|
||
"github.com/gomodule/redigo/redis"
|
||
)
|
||
|
||
// 自定义Redis连接池对象
|
||
type RedisPool struct {
|
||
name string
|
||
address string
|
||
pool *redis.Pool
|
||
}
|
||
|
||
// 获取自定义Redis连接池对象的名称
|
||
// 返回值:
|
||
// 自定义Redis连接池对象的名称
|
||
func (this *RedisPool) GetName() string {
|
||
return this.name
|
||
}
|
||
|
||
// 获取自定义Redis连接池对象的目标地址
|
||
// 返回值:
|
||
// 自定义Redis连接池对象的目标地址
|
||
func (this *RedisPool) GetAddress() string {
|
||
return this.address
|
||
}
|
||
|
||
// 从自定义连接池中获取连接,在使用后需要调用Close方法
|
||
// 返回值:
|
||
// 连接对象
|
||
func (this *RedisPool) GetConnection() redis.Conn {
|
||
return this.pool.Get()
|
||
}
|
||
|
||
// 关闭自定义连接池
|
||
func (this *RedisPool) Close() {
|
||
this.pool.Close()
|
||
}
|
||
|
||
// 测试连接情况
|
||
// 返回值:
|
||
// 错误对象
|
||
func (this *RedisPool) TestConnection() error {
|
||
conn := this.GetConnection()
|
||
defer conn.Close()
|
||
|
||
_, err := conn.Do("PING")
|
||
|
||
return err
|
||
}
|
||
|
||
// 创建新的Redis连接池对象(obsolete,建议使用NewRedisPool2)
|
||
// name:连接池对象名称
|
||
// connectionString:Redis服务器连接地址
|
||
// password:Redis服务器连接密码
|
||
// database:Redis服务器选择的数据库
|
||
// maxActive:Redis连接池允许的最大活跃连接数量
|
||
// maxIdle:Redis连接池允许的最大空闲数量
|
||
// idleTimeout:连接被回收前的空闲时间
|
||
// dialConnectTimeout:连接Redis服务器超时时间
|
||
// 返回值:
|
||
// Redis连接池对象
|
||
func NewRedisPool(name, connectionString, password string, database, maxActive, maxIdle int, idleTimeout, dialConnectTimeout time.Duration) *RedisPool {
|
||
redisConfig := NewRedisConfig2(connectionString, password, database, maxActive, maxIdle, idleTimeout, dialConnectTimeout)
|
||
return NewRedisPool2(name, redisConfig)
|
||
}
|
||
|
||
// 创建新的Redis连接池对象
|
||
// name:连接池对象名称
|
||
// redisConfig:Redis配置对象
|
||
// 返回值:
|
||
// Redis连接池对象
|
||
func NewRedisPool2(name string, redisConfig *RedisConfig) *RedisPool {
|
||
poolObj := &redis.Pool{
|
||
MaxActive: redisConfig.MaxActive,
|
||
MaxIdle: redisConfig.MaxIdle,
|
||
IdleTimeout: redisConfig.IdleTimeout,
|
||
Dial: func() (redis.Conn, error) {
|
||
options := make([]redis.DialOption, 0, 4)
|
||
options = append(options, redis.DialConnectTimeout(redisConfig.DialConnectTimeout))
|
||
options = append(options, redis.DialDatabase(redisConfig.Database))
|
||
if redisConfig.Password != "" {
|
||
options = append(options, redis.DialPassword(redisConfig.Password))
|
||
}
|
||
|
||
conn, err := redis.Dial("tcp", redisConfig.ConnectionString, options...)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("Dial failed, err:%s", err)
|
||
}
|
||
|
||
return conn, err
|
||
},
|
||
TestOnBorrow: func(conn redis.Conn, t time.Time) error {
|
||
if time.Since(t) < time.Minute {
|
||
return nil
|
||
}
|
||
_, err := conn.Do("PING")
|
||
return err
|
||
},
|
||
}
|
||
|
||
return &RedisPool{
|
||
name: name,
|
||
address: redisConfig.ConnectionString,
|
||
pool: poolObj,
|
||
}
|
||
}
|