go-redis:拨号tcp:查找i/o超时

问题描述 投票:0回答:1

go-redis 空闲后无法恢复,我不知道如何配置它自动重新连接并重试。当我的服务在空闲后尝试执行 redis 命令时,它第一次失败。然而,随后的尝试确实按预期工作。

这是错误:

dial tcp: lookup z.ec2.redns.redis-cloud.com: i/o timeout

这是失败的代码行:

r.SIsMember(context.TODO(), "x", x).Result()

这是我的连接方式:

    opt, err := redis.ParseURL("redis://x:[email protected]:12719?dial_timeout=5&read_timeout=6s&max_retries=2")
    if err != nil {
        log.Fatal().Err(err).Send()
    }

    opt.DialTimeout = 5 * time.Second
    opt.ReadTimeout = 3 * time.Second
    opt.WriteTimeout = 3 * time.Second
    opt.PoolTimeout = 6 * time.Second
    opt.MinRetryBackoff = 1 * time.Second
    opt.MaxRetryBackoff = 5 * time.Second
    opt.MaxRetries = 5

如何在第一次尝试时从空闲连接中恢复?

go redis go-redis
1个回答
0
投票

看起来,在您的服务空闲后,所有 Redis 客户端池连接都会在

ConnMaxIdleTime
(默认为 30 分钟)内被丢弃,并且当池尝试创建新连接时,它会超时 (
DialTimeout
)。

Redis Go 客户端不会重试创建新连接时的超时错误,因此您会直接收到错误,并且可能在下一次尝试时连接会更快成功。

您可以尝试增加

DialTimeout
,以便在尝试创建新连接时池有更多的余量。

© www.soinside.com 2019 - 2024. All rights reserved.