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

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