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