我目前正在使用redigo库为我的项目创建一个redis池
我每次从池中获取一个时都使用defer
来释放redis连接
c := redisPool.Get()
defer c.Close()
但如果设置了MaxActive
,它将在这种情况下永远阻止
func function1() {
c := redisPool.Get()
defer c.Close()
function2()
...
}
func function2() {
c := redisPool.Get()
defer c.Close()
...
}
我应该在一个goroutine中只使用一个redis连接吗?
你有几个选择。
Close()
,返回到池的连接,然后调用function2
。好处:工作,不太复杂。缺点:在函数的多个退出点的情况下返回连接的管理。function2
以获取它使用的redis.Conn
参数,并将该连接关闭。上行:延迟仍然适用于function1
。缺点:你需要一个连接来调用function2
并需要从呼叫站点进行连接管理。在你的例子中,这很容易。function1
并发呼叫数量有限。您可以使用以下方法确保应用程序不会锁定/中断。
wait: true
。//如果Wait为true且池处于MaxActive限制,则Get()会等待//在返回之前将连接返回到池中。
maxclient
限制大于MaxActive
默认的maxclient
是10k。大多数应用程序可以通过避免对Get()的调用和Close()调用之间的长操作或阻塞操作(除了调用Redis)来保持连接使用率低。
希望这可以帮助。