【问题标题】:redigo different pool connect to single serverredigo 不同的池连接到单个服务器
【发布时间】:2018-04-30 00:20:53
【问题描述】:

所以,我有必要连接到 3 个 redis 服务器。我创建了 3 个连接池,并初始化它们中的每一个。 但是 redigo 似乎只连接到单个 redis 服务器,尽管我使用不同的池获得连接。

使用 redigo,下面是我的代码

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

var poolA *redis.Pool
var poolB *redis.Pool
var poolC *redis.Pool

func main() {
    poolA = &redis.Pool{}
    poolB = &redis.Pool{}
    poolC = &redis.Pool{}

    connections := []string{"localhost:6379", "localhost2:6379", "localhost3:6379"}

    for k, v := range connections {
        redisPool := &redis.Pool{
            Dial: func() (redis.Conn, error) {
                return redis.Dial("tcp", v)
            },
            TestOnBorrow: func(c redis.Conn, t time.Time) error {
                if time.Since(t) < time.Minute {
                    return nil
                }
                _, err := c.Do("PING")
                return err
            },
            IdleTimeout: time.Duration(10) * time.Second,
            MaxActive:   100,
            MaxIdle:     100 / 2,
            Wait:        true,
        }

        if k == 0 {
            fmt.Println("poolA:", v)
            poolA = redisPool
        }
        if k == 1 {
            fmt.Println("poolB:", v)
            poolB = redisPool
        }
        if k == 2 {
            fmt.Println("poolC:", v)
            poolC = redisPool
        }
    }

    con := poolA.Get()
    defer con.Close()
    count, err := redis.Int(con.Do("SADD", "any:test", 3246))
    if err != nil {
        fmt.Println("error querying redis:", err.Error())
    }
    fmt.Println("count=", count)

    con2 := poolB.Get()
    defer con2.Close()
    count, err = redis.Int(con2.Do("SADD", "any:test", 3246))
    if err != nil {
        fmt.Println("error querying redis:", err.Error())
    }
    fmt.Println("count=", count)

    con3 := poolC.Get()
    defer con3.Close()
    count, err = redis.Int(con3.Do("SADD", "any:test", 3246))
    if err != nil {
        fmt.Println("error querying redis:", err.Error())
    }
    fmt.Println("count=", count)
}

问题是,所有 3 个池都连接到最后一个服务器/连接,结果如下所示。 任何想法?

poolA: localhost:6379
poolB: localhost2:6379
poolC: localhost3:6379
error querying redis: dial tcp: lookup localhost3: no such host
count= 0
error querying redis: dial tcp: lookup localhost3: no such host
count= 0
error querying redis: dial tcp: lookup localhost3: no such host
count= 0

Process finished with exit code 0

【问题讨论】:

标签: go redis pool redigo


【解决方案1】:

拨号函数使用单个变量v。这些函数在调用时使用分配给v 的最后一个值。

要解决此问题,请在 for 循环范围内声明一个变量,并在 dial 函数中使用该变量:

for k, v := range connections {
    v := v // Declare variable scoped inside for loop 
    redisPool := &redis.Pool{
        Dial: func() (redis.Conn, error) {
            return redis.Dial("tcp", v)  // uses variable scoped inside for loop
        },
    ...

除了这个问题,池设置没有意义。因为池被配置为丢弃已经空闲 10 秒的连接,所以借用功能测试永远不会 ping 服务器。

【讨论】:

  • 没用,同样的事情。我什至不使用for循环,而是分别初始化2个redis池,它们两个连接到同一个服务器,而不是故意连接到不同的服务器。顺便说一句,我只是按照 redigo 文档中的示例进行操作,那么您对 ​​TestOnBorrow 有什么建议?
  • 对不起,我有一个错字。它像你建议的那样工作。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2012-07-30
  • 2016-02-19
  • 2017-04-30
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多