在这种情况下使用 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 连接吗?

您可以使用以下方法来确保应用程序不会锁定/中断。

  1. 在池配置中设置 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.

  1. 确认服务器的maxclient限制大于MaxActive默认maxclient是10k。

大多数应用程序可以通过避免在调用 Get() 和调用 Close() 之间进行长时间或阻塞操作(对 Redis 的调用除外)来保持较低的连接使用率。

希望对您有所帮助。

这里有几个选项。

  1. 完成后,您可以Close(),将连接返回到池中,然后调用function2。好处:有效,不太复杂。缺点:在函数有多个出口点的情况下返回连接的管理。

  2. 您可以更改 function2 以采用它使用的 redis.Conn 参数,然后关闭该连接。好处:延迟仍然适用于 function1。缺点:您需要连接才能调用 function2 并且需要从调用站点进行连接管理。在您的示例中,这很简单。

  3. 确保您至少有 N*2 个最大连接数,其中 N 是将 运行 的最大并发 goroutine 数。好处:您的代码保持 as-is 不变。缺点:您可以同时调用 function1 的数量有限。