在这种情况下使用 redis 池的正确方法
Proper way to use redis pool in this scenario
我目前正在为我创建 redis 池的项目使用 redigo 库
每次从池中获取一个时,我都使用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 连接吗?
您可以使用以下方法来确保应用程序不会锁定/中断。
- 在池配置中设置
wait: true
。
// If Wait is true and the pool is at the MaxActive limit, then Get()
waits // for a connection to be returned to the pool before returning.
- 确认服务器的
maxclient
限制大于MaxActive
默认maxclient
是10k。
大多数应用程序可以通过避免在调用 Get() 和调用 Close() 之间进行长时间或阻塞操作(对 Redis 的调用除外)来保持较低的连接使用率。
希望对您有所帮助。
这里有几个选项。
完成后,您可以Close()
,将连接返回到池中,然后调用function2
。好处:有效,不太复杂。缺点:在函数有多个出口点的情况下返回连接的管理。
您可以更改 function2
以采用它使用的 redis.Conn
参数,然后关闭该连接。好处:延迟仍然适用于 function1
。缺点:您需要连接才能调用 function2
并且需要从调用站点进行连接管理。在您的示例中,这很简单。
确保您至少有 N*2 个最大连接数,其中 N 是将 运行 的最大并发 goroutine 数。好处:您的代码保持 as-is 不变。缺点:您可以同时调用 function1
的数量有限。
我目前正在为我创建 redis 池的项目使用 redigo 库
每次从池中获取一个时,我都使用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 连接吗?
您可以使用以下方法来确保应用程序不会锁定/中断。
- 在池配置中设置
wait: true
。
// If Wait is true and the pool is at the MaxActive limit, then Get() waits // for a connection to be returned to the pool before returning.
- 确认服务器的
maxclient
限制大于MaxActive
默认maxclient
是10k。
大多数应用程序可以通过避免在调用 Get() 和调用 Close() 之间进行长时间或阻塞操作(对 Redis 的调用除外)来保持较低的连接使用率。
希望对您有所帮助。
这里有几个选项。
完成后,您可以
Close()
,将连接返回到池中,然后调用function2
。好处:有效,不太复杂。缺点:在函数有多个出口点的情况下返回连接的管理。您可以更改
function2
以采用它使用的redis.Conn
参数,然后关闭该连接。好处:延迟仍然适用于function1
。缺点:您需要连接才能调用function2
并且需要从调用站点进行连接管理。在您的示例中,这很简单。确保您至少有 N*2 个最大连接数,其中 N 是将 运行 的最大并发 goroutine 数。好处:您的代码保持 as-is 不变。缺点:您可以同时调用
function1
的数量有限。