場景:
當我們要進行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等都是,其他還沒測試),並沒有進行真正的連接,所以要減少發起連接的次數,還是乖乖的用連接池吧。