开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:Redis 连接池的使用案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9796
Redis 连接池的使用案例
内容介绍:
一、核心代码
二、案例
一、核心代码
1.核心代码
var pool *redis.Pool
pool=&redis.Pool{
Maxidle: 8,
//表示最大空闲链接数
MaxActive: 0,
//表示和数据库的最大链接数,0 表示没有限制 ,但是不是实际情况中是无限大的,还要受系统的限制
IdleTimeout: 100,
//最大空闲时间,
Dial: func() (redis.Conn,error){
//代表初始化的链接池代码
return redis.Dial("tcp", "localhost:6379")
//代表具体链接的 ip 的 redis ,6379是端口号
},
},
c :=pool.Get()
//从链接池中取出一个链接
pool.Close()
//关闭链接池 ,一旦关闭了链接池以后,就不能从链接池中再取出链接
2.使用链接池满足要求
①初始化在 init 里进行
②使用 pool.Get
打开 redis 插件中的文件夹找到 pool,里面有详细的说明
pool 是一个结构体(struct)
方法:Dial func() (Conn , error)
MaxActive int
在给定时间内,最大的一个链接数,当数等于0时,会没有限制
标准配置:
MaxIdle :8
MaxActive:0
IdleTimeout:300
当性能不够时,可以将数字适当调大
二、案例
创建文件夹 redispool-main.go
Package main
import (
“
fmt
”
“
github.com/garyburd/redigo/redis
”
)
//引入redis包
//定义一个全局的 pool
var pool *redis.Pool
//当启动程序时,就初始化链接池
func init() {
pool=&redis.Pool{
Maxidle: 8,
//表示最大空闲链接数
MaxActive: 0,
//表示和数据库的最大链接数,0 表示没有限制 ,但是不是实际情况中是无限大的,还要受系统的限制
IdleTimeout: 100,
//最大空闲时间,
Dial: func() (redis.Conn,error){
//代表初始化的链接池代码
return redis.Dial("tcp", "localhost:6379")
//代表具体链接的 ip 的 redis ,6379是端口号
},
}
}
func main() {
//先从 pool 取出一个链接
conn :=pool.Get()
defer conn.close()
//关闭链接池
_, err :=conn.Do(
“
Set
”
,
“
name
”
,
”
汤姆猫
”
)
if err !=nil {
fmt.Println(
“
conn.Do err=
”
, err)
return
}
//取出
r, err := redis.string(conn.Do(
“
Get
”
,
”
name
”
))
if err !=nil {
fmt.Println(
“
conn.Do err=
”
, err)
return
}
fmt.Println(
“
r=
”
, r)
}
//如果要从 pool 里面取出链接,一定保证链接池是没有关闭的
go run main.go
汤姆猫
pool.Close
//表示链接池已经关闭,一旦关闭,就再也取不出内容
conn2 := pool.Get()
_, err :=conn2.Do(
“
Set
”
,
“
name
”
,
”
汤姆猫~~2
”
)
if err !=nil {
fmt.Println(
“
conn.Do err=
”
, err)
return
}
//取出
r, err := redis.string(conn2.Do(
“
Get
”
,
”
name2
”
))
if err !=nil {
fmt.Println(
“
conn.Do err~~~~=
”
, err)
return
}
fmt.Println(
“
r=
”
, r2)
//fmt.Println(
“
conn2=
”
,conn2)
go run main.go
报错