Redis 连接失败时重试
Retry on redis connection failure
想知道为什么 redigo 决定不导出 errorConn 类型,这将允许应用程序对连接失败进行特定的错误处理。实施后,应用程序必须将这些作为一般错误处理。
例如,我们的应用程序通常不关心单个 PUT 是否失败,但如果问题是 redis 连接失败或 redis 池耗尽,则继续下一个 PUT(特别是如果它需要打开一个新的连接)是个坏主意。我们应该停止并重试(使用指数退避),直到连接恢复。
Code redigo 示例 returns 如果连接池耗尽则出现一般性错误
你的代码行中link return 两个值各自的类型:(Conn, error)
.
if !p.Wait && p.MaxActive > 0 && p.active >= p.MaxActive {
p.mu.Unlock()
return errorConn{ErrPoolExhausted}, ErrPoolExhausted
}
类型 Conn
是具有 Err
方法的接口。
// Err returns a non-nil value when the connection is not usable.
Err() error
因此,要获取潜在错误,您可以:
- 对第一个 return 值调用
Err
方法;或
- 检查第二个
error
return 值。
附带说明一下,比较错误的推荐方法是使用标准库 errors
包中的 errors.Is
and/or errors.As
。
想知道为什么 redigo 决定不导出 errorConn 类型,这将允许应用程序对连接失败进行特定的错误处理。实施后,应用程序必须将这些作为一般错误处理。
例如,我们的应用程序通常不关心单个 PUT 是否失败,但如果问题是 redis 连接失败或 redis 池耗尽,则继续下一个 PUT(特别是如果它需要打开一个新的连接)是个坏主意。我们应该停止并重试(使用指数退避),直到连接恢复。
Code redigo 示例 returns 如果连接池耗尽则出现一般性错误
你的代码行中link return 两个值各自的类型:(Conn, error)
.
if !p.Wait && p.MaxActive > 0 && p.active >= p.MaxActive {
p.mu.Unlock()
return errorConn{ErrPoolExhausted}, ErrPoolExhausted
}
类型 Conn
是具有 Err
方法的接口。
// Err returns a non-nil value when the connection is not usable.
Err() error
因此,要获取潜在错误,您可以:
- 对第一个 return 值调用
Err
方法;或 - 检查第二个
error
return 值。
附带说明一下,比较错误的推荐方法是使用标准库 errors
包中的 errors.Is
and/or errors.As
。