golang的全局声明的生命周期

场景:

当我们要进行redis操作或者其他中间件操作的时候,为了少发起服务端的连接,我们会在main函数外先建立连接,以减少服务端的连接次数

真相:

事实上,很多中间件的连接只是一个语法声明,其实并没有进行真正的连接,比如下面的代码

package main

import (
  "fmt"
  "github.com/garyburd/redigo/redis"
  "github.com/spf13/cast"
  "math/rand"
  "time"
)

var (
  rds, errxx = redis.Dial("tcp", "1.1.1.1:3333")
)

func Do(i int) {
  fmt.Println("开始进行redis操作...")
  act, err := rds.Do("SET", "name" + cast.ToString(i), i)
  fmt.Println(act, "--------", err)
}


func main() {
  ticker := time.NewTicker(3 * time.Second)
  defer ticker.Stop()

  for {
    select {
    case <-ticker.C:
      Do(rand.Intn(1000))
    }
  }
}

事实上每一个操作redis的时候,都会对redis重新发起一次连接,并没有起到减少连接的作用

验证

运行上面的程序, 然后观察redis的数据写入, 在写入一些数据之后,我们停止redis的服务,程序就会报错

use of closed network connection

可见即使是放在main函数外的中间件句柄, 也只是一个声明(redis, mysql等都是,其他还没测试),并没有进行真正的连接,所以要减少发起连接的次数,还是乖乖的用连接池吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章