在这种情况下使用redis池的正确方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在这种情况下使用redis池的正确方法相关的知识,希望对你有一定的参考价值。

我目前正在使用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连接吗?

答案

你有几个选择。

  1. 完成后你可以Close(),返回到池的连接,然后调用function2。好处:工作,不太复杂。缺点:在函数的多个退出点的情况下返回连接的管理。
  2. 您可以更改function2以获取它使用的redis.Conn参数,并将该连接关闭。上行:延迟仍然适用于function1。缺点:你需要一个连接来调用function2并需要从呼叫站点进行连接管理。在你的例子中,这很容易。
  3. 确保至少有N * 2个最大连接数,其中N是将运行的最大并发goroutine数。好处:您的代码保持原样,无需更改。缺点:您可以进行的function1并发呼叫数量有限。
另一答案

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

  1. 在池配置中设置wait: true

//如果Wait为true且池处于MaxActive限制,则Get()会等待//在返回之前将连接返回到池中。

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

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

希望这可以帮助。

以上是关于在这种情况下使用redis池的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

python 里的 redis 连接池的原理

Redis实战-Jedis连接池的使用方法

Redis实战-Jedis连接池的使用方法

仅在按照意图进行时才更改片段(在这种情况下,他们实际上共享应用程序)

MPEG DASH 部分片段

python redis之连接池的原理