redis 连接池_golang开发:类库篇(二) Redis连接池的使用

0fdc07302c8f95b77590cd33b697e3ea.png

为什么要使用连接池

一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源。所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接时间,就能显著缩短请求时间。

所以就有了连接池的概念,在初始化时,创建一定数量的连接,先把所有连接存起来,然后,谁需要使用,从这里取走,干完活立马放回来。 如果请求数超出连接池容量,那么就排队等待或者直接丢弃掉。这样就可以省掉每次都创建和关闭连接的资源消耗和时间。

如果不使用连接池,那么,每次传输数据,我们都需要耗费大量的系统资源进行创建连接,收发数据,关闭连接。很明显,重复创建连接 关闭连接这样的消耗是可以节省。

怎么使用Redis连接池

先看下简单的使用案例。

首先当然是下载类库包 go get http://github.com/gomodule/redigo/redis

贴下简单的使用代码

  1. package main
  2. import (
  3. red "github.com/gomodule/redigo/redis"
  4. "time"
  5. "fmt"
  6. )
  7. type Redis struct {
  8. pool *red.Pool
  9. }
  10. var redis *Redis
  11. func initRedis() {
  12. redis = new(Redis)
  13. redis.pool = &red.Pool{
  14. MaxIdle: 256,
  15. MaxActive: 0,
  16. IdleTimeout: time.Duration(120),
  17. Dial: func() (red.Conn, error) {
  18. return red.Dial(
  19. "tcp",
  20. "127.0.0.1:6379",
  21. red.DialReadTimeout(time.Duration(1000)*time.Millisecond),
  22. red.DialWriteTimeout(time.Duration(1000)*time.Millisecond),
  23. red.DialConnectTimeout(time.Duration(1000)*time.Millisecond),
  24. red.DialDatabase(0),
  25. //red.DialPassword(""),
  26. )
  27. },
  28. }
  29. }
  30. func Exec(cmd string, key interface{}, args ...interface{}) (interface{}, error) {
  31. con := redis.pool.Get()
  32. if err := con.Err(); err != nil {
  33. return nil, err
  34. }
  35. defer con.Close()
  36. parmas := make([]interface{}, 0)
  37. parmas = append(parmas, key)
  38. if len(args) > 0 {
  39. for _, v := range args {
  40. parmas = append(parmas, v)
  41. }
  42. }
  43. return con.Do(cmd, parmas...)
  44. }
  45. func main() {
  46. initRedis()
  47. Exec("set","hello","world")
  48. fmt.Print(2)
  49. result,err := Exec("get","hello")
  50. if err != nil {
  51. fmt.Print(err.Error())
  52. }
  53. str,_:=red.String(result,err)
  54. fmt.Print(str)
  55. }

使用类库操作连接池就比较简单,只要从连接池获取一个连接,进行数据操作,然后关闭连接。连接池对连接的创建 回收等的管理,都是连接池内部实现。 执行看下结果是不是预想的

  1. go build -o test_web.bin
  2. ./test_web.bin
  3. 2world

结果跟预想的一毛一样

基本配置说明

MaxIdle:最大的空闲连接数,表示即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态。 MaxActive:最大的连接数,表示同时最多有N个连接。0表示不限制。 IdleTimeout:最大的空闲连接等待时间,超过此时间后,空闲连接将被关闭。如果设置成0,空闲连接将不会被关闭。应该设置一个比redis服务端超时时间更短的时间。 DialConnectTimeout:连接Redis超时时间。 DialReadTimeout:从Redis读取数据超时时间。 DialWriteTimeout:向Redis写入数据超时时间。

连接流程大概是这样的 1.尝试从空闲列表MaxIdle中,获得一个可用连接;如果成功直接返回,失败则尝试步骤2 2.如果当前的MaxIdle < 连接数 < MaxActive,则尝试创建一个新连接,失败则尝试步骤3

  1. 如果连接数 > MaxActive就等待,直到满足步骤2的条件,重复步骤2

遇到过的问题

目前为止,连接池的问题只遇到过一次问题,而且是在测试环境的,当时的配置是

  1. DialConnectTimeout:time.Duration(200)*time.Millisecond
  2. DialReadTimeout:time.Duration(200)*time.Millisecond
  3. DialWriteTimeout:time.Duration(200)*time.Millisecond

配置的都是200毫秒。有一次使用hgetall的时候,就一直报错,大概类似下面的提示

  1. read tcp 127.0.0.1:6379: i/o timeout

字面意思就是 read tcp 超时,可能某些写入大点数据的时候也会报,write tcp timeout。 后来将读写超时时间都改为1000毫秒,就再也没有出现过类似的报错。

当然了,想了解更多的Redis使用,可以看下官方的文档,里面有各种情况的各种说明。 https://github.com/gomodule/redigo/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值