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