Go---Redis连接池


之前一篇文章介绍过使用redigo连接redis数据库处理,在使用中发现如果初始化一条链接连接redis做相关操作,使用中发现当两个程序交替使用redis时,先前建立的链接会断掉,只能每次操作的时候重新建立链接,使用后关闭。后来发现redigo有一个连接池的功能,所以改用链接池处理

先介绍下链接池的结构

type Pool struct { //Dial 是创建链接的方法 Dial func() (Conn, error) //TestOnBorrow 是一个测试链接可用性的方法 TestOnBorrow func(c Conn, t time.Time) error // 最大的空闲连接数,表示即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态 MaxIdle int // 最大的激活连接数,表示同时最多有N个连接 ,为0事表示没有限制 MaxActive int //最大的空闲连接等待时间,超过此时间后,空闲连接将被关闭 IdleTimeout time.Duration // 当链接数达到最大后是否阻塞,如果不的话,达到最大后返回错误 Wait bool }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

使用方法可以看下边的例子

package main import ( "flag" "fmt" "github.com/garyburd/redigo/redis" "time" ) //声明一些全局变量 var ( pool *redis.Pool redisServer = flag.String("redisServer", ":6379", "") redisPassword = flag.String("redisPassword", "123456", "") ) //初始化一个pool func newPool(server, password string) *redis.Pool { return &redis.Pool{ MaxIdle:  3, MaxActive:  5, IdleTimeout: 240 * time.Second, 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 } return c, err }, TestOnBorrow: func(c redis.Conn, t time.Time) error { if time.Since(t) < time.Minute { return nil } _, err := c.Do("PING") return err }, } } func main() { flag.Parse() pool = newPool(*redisServer, *redisPassword) conn := pool.Get() defer conn.Close() //redis操作 v, err := conn.Do("SET", "pool", "test") if err != nil { fmt.Println(err) return } fmt.Println(v) v, err = redis.String(conn.Do("GET", "pool")) if err != nil { fmt.Println(err) return } fmt.Println(v) }

方便使用也同样做了一个封装


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM