golang的全局声明的生命周期

放肆的年华 提交于 2019-11-29 10:19:08

场景:

当我们要进行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等都是,其他还没测试),并没有进行真正的连接,所以要减少发起连接的次数,还是乖乖的用连接池吧。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!