登录
首页 >  Golang >  Go问答

golang中redis连接池的问题

来源:SegmentFault

时间:2023-02-24 11:05:27 437浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《golang中redis连接池的问题》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下Redis、go,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

redis连接池的疑问,代码如下

package utils

import (
    red "github.com/gomodule/redigo/redis"
    "time"
    "fmt"
)

type Redis struct {
    pool     *red.Pool
}

var redis *Redis

func initRedis() {
    redis = new(Redis)
    redis.pool = &red.Pool{
        MaxIdle:     256,
        MaxActive:   0,
        IdleTimeout: time.Duration(120),
        Dial: func() (red.Conn, error) {
            return red.Dial(
                "tcp",
                "127.0.0.1:6379",
                red.DialReadTimeout(time.Duration(1000)*time.Millisecond),
                red.DialWriteTimeout(time.Duration(1000)*time.Millisecond),
                red.DialConnectTimeout(time.Duration(1000)*time.Millisecond),
                red.DialDatabase(0),
                //red.DialPassword(""),
            )
        },
    }
}

func Exec(cmd string, key interface{}, args ...interface{}) (interface{}, error) {
    con := redis.pool.Get()
    if err := con.Err(); err != nil {
        return nil, err
    }
    defer con.Close()
    parmas := make([]interface{}, 0)
    parmas = append(parmas, key)

    if len(args) > 0 {
        for _, v := range args {
            parmas = append(parmas, v)
        }
    }
    return con.Do(cmd, parmas...)
}

func main() {
    initRedis()
    Exec("set","hello","world")
    fmt.Print(2)
    result,err := Exec("get","hello")
    if err != nil {
        fmt.Print(err.Error())
    }
    str,_:=red.String(result,err)
    fmt.Print(str)
}

这样操作后,每次调用initRedis()是不是相当于重新执行了一次redis连接?

正确答案

不会,

initRedis()
只是初始化Pool对象,多次调用只会重新初始化redis对象,原有的会被gc回收。实际连接是在
pool.Get
做的。

func (p *Pool) Get() Conn {
    pc, err := p.get(nil)
    if err != nil {
        return errorConn{err}
    }
    return &activeConn{p: p, pc: pc}
}

// get prunes stale connections and returns a connection from the idle list or
// creates a new connection.
func (p *Pool) get(ctx context.Context) (*poolConn, error) {
    // ...
    c, err := p.dial(ctx)
    // ...
}

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《golang中redis连接池的问题》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表