回覆列表
  • 1 # 使用者57358069570

    在建立連線池之後,起一個 goroutine,每隔一段 idleTime 傳送一個 PING 到 Redis server。其中,idleTime 略小於 Redis server 的 timeout 配置。

    連線池初始化部分程式碼如下:

    p, err := pool.New("tcp", u.Host, concurrency) errHndlr(err) go func() { for { p.Cmd("PING") time.Sleep(idelTime * time.Second) } }()

    使用 redis 傳輸資料部分程式碼如下:

    func redisDo(p *pool.Pool, cmd string, args ...interface{}) (reply *redis.Resp, err error) { reply = p.Cmd(cmd, args...) if err = reply.Err; err != nil { if err != io.EOF { Fatal.Println("redis", cmd, args, "err is", err) } } return }

    其中,Radix.v2 連線池內部進行了連線池內連線的獲取和放回,程式碼如下:

    // Cmd automatically gets one client from the pool, executes the given command // (returning its result), and puts the client back in the pool func (p *Pool) Cmd(cmd string, args ...interface{}) *redis.Resp { c, err := p.Get() if err != nil { return redis.NewResp(err) } defer p.Put(c) return c.Cmd(cmd, args...) }

    這樣,我們就有了 keepalive 的機制,不會出現 timeout 的連線了,從 redis 連線池裡面取出的連線都是可用的連線了。看似簡單的程式碼,卻完美的解決了連線池裡面超時連線的問題。同時,就算 Redis server 重啟等情況,也能保證連線自動重連。

  • 中秋節和大豐收的關聯?
  • 一套房子,買時40萬,現賣90萬,出租2600元,哪個划算,大家怎麼看?