如何为Redigo的Redis连接池获取连接设置等待超时?
Redigo连接池Get等待超时的实现方案
redigo原生的Pool.Get()方法在开启Wait选项后,当连接池达到MaxActive上限时会一直等待可用连接,但本身并不支持直接设置等待超时时间。
要实现等待超时,你可以通过以下方式自定义封装:
方法一:用Context包装Get调用
通过goroutine异步调用Get(),同时利用context.WithTimeout来控制等待时长,超时则返回错误。示例代码如下:
import ( "context" "time" "github.com/gomodule/redigo/redis" ) func GetRedisConnWithTimeout(pool *redis.Pool, timeout time.Duration) (redis.Conn, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() connChan := make(chan redis.Conn, 1) errChan := make(chan error, 1) go func() { conn, err := pool.Get() if err != nil { errChan <- err return } select { case connChan <- conn: case <-ctx.Done(): // 超时后拿到连接,需关闭放回池避免泄漏 conn.Close() } }() select { case conn := <-connChan: return conn, nil case err := <-errChan: return nil, err case <-ctx.Done(): return nil, ctx.Err() } }
这段代码里,当超时触发时,如果goroutine后续拿到了连接,会自动关闭连接放回池,避免连接泄漏。
注意事项
- 这种封装方式不会修改redigo原生连接池的逻辑,只是在外部增加了超时控制;
- 如果你的业务对连接获取延迟敏感,建议同时合理调整
MaxActive、MaxIdle等连接池参数,减少等待场景的出现。
内容的提问来源于stack exchange,提问作者Asnim P Ansari
相关产品推荐
相关产品推荐

