golang开发:类库篇(二) Redis连接池的使用
为什么要使用连接池一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源。所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接时间,就能显著缩短请求时间。 所以就有了连接池的概念,在初始化时,创建一定数量的连接,先把所有连接存起来,然后,谁需要使用,从这里取走,干完活立马放回来。 如果请求数超出连接池容量,那么就排队等待或者直接丢弃掉。这样就可以省掉每次都创建和关闭连接的资源消耗和时间。 如果不使用连接池,那么,每次传输数据,我们都需要耗费大量的系统资源进行创建连接,收发数据,关闭连接。很明显,重复创建连接 关闭连接这样的消耗是可以节省。 怎么使用Redis连接池先看下简单的使用案例。 package main import ( red "github.com/gomodule/redigo/redis" "time" "fmt" ) type Redis struct { pool *red.Pool } var redis *Redis func initRedis() { redis = new(Redis) redis.pool = &red.Pool{ MaxIdle: 256,MaxActive: 0,IdleTimeout: time.Duration(120),Dial: func() (red.Conn,error) { return red.Dial( "tcp","127.0.0.1:6379",red.DialReadTimeout(time.Duration(1000)*time.Millisecond),red.DialWriteTimeout(time.Duration(1000)*time.Millisecond),red.DialConnectTimeout(time.Duration(1000)*time.Millisecond),red.DialDatabase(0),//red.DialPassword(""),) },} } func Exec(cmd string,key interface{},args ...interface{}) (interface{},error) { con := redis.pool.Get() if err := con.Err(); err != nil { return nil,err } defer con.Close() parmas := make([]interface{},0) parmas = append(parmas,key) if len(args) > 0 { for _,v := range args { parmas = append(parmas,v) } } return con.Do(cmd,parmas...) } func main() { initRedis() Exec("set","hello","world") fmt.Print(2) result,err := Exec("get","hello") if err != nil { fmt.Print(err.Error()) } str,_:=red.String(result,err) fmt.Print(str) } 使用类库操作连接池就比较简单,只要从连接池获取一个连接,进行数据操作,然后关闭连接。连接池对连接的创建 回收等的管理,都是连接池内部实现。 go build -o test_web.bin ./test_web.bin 2world 结果跟预想的一毛一样 基本配置说明MaxIdle:最大的空闲连接数,表示即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态。 连接流程大概是这样的
遇到过的问题目前为止,连接池的问题只遇到过一次问题,而且是在测试环境的,当时的配置是 DialConnectTimeout:time.Duration(200)*time.Millisecond DialReadTimeout:time.Duration(200)*time.Millisecond DialWriteTimeout:time.Duration(200)*time.Millisecond 配置的都是200毫秒。有一次使用hgetall的时候,就一直报错,大概类似下面的提示 read tcp 127.0.0.1:6379: i/o timeout 字面意思就是 read tcp 超时,可能某些写入大点数据的时候也会报,write tcp timeout。 当然了,想了解更多的Redis使用,可以看下官方的文档,里面有各种情况的各种说明。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |