golang的全局声明的生命周期

场景:

当咱们要进行redis操做或者其余中间件操做的时候,为了少发起服务端的链接,咱们会在main函数外先创建链接,以减小服务端的链接次数mysql

真相:

事实上,不少中间件的链接只是一个语法声明,其实并无进行真正的链接,好比下面的代码git

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从新发起一次链接,并无起到减小链接的做用github

验证

运行上面的程序, 而后观察redis的数据写入, 在写入一些数据以后,咱们中止redis的服务,程序就会报错golang

use of closed network connection

可见即便是放在main函数外的中间件句柄, 也只是一个声明(redis, mysql等都是,其余还没测试),并无进行真正的链接,因此要减小发起链接的次数,仍是乖乖的用链接池吧。redis

相关文章
相关标签/搜索