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
如何在第一次尝试时从空闲连接中恢复?
看起来,在您的服务空闲后,所有 Redis 客户端池连接都会在
ConnMaxIdleTime
(默认为 30 分钟)内被丢弃,并且当池尝试创建新连接时,它会超时 (DialTimeout
)。
Redis Go 客户端不会重试创建新连接时的超时错误,因此您会直接收到错误,并且可能在下一次尝试时连接会更快成功。
您可以尝试增加
DialTimeout
,以便在尝试创建新连接时池有更多的余量。