我为什么要关闭或保持Redis连接打开?

时间:2014-05-09 16:39:09

标签: php redis segmentation-fault timeout phpredis

我在PHP项目中使用Redis。我使用phpredis作为客户端。有时,在长CLI脚本中,我会遇到PHP分段错误。

我之前经历过phpredis在连接超时时遇到问题。由于我的Redis配置被配置为在300秒后自动关闭空闲连接,我猜这会导致分段错误。

为了能够选择是否增加连接超时或将其默认为0(这意味着“永不超时”),我想知道可能的优点和缺点是什么?

为什么我永远不会关闭连接? 为什么我要确保连接不会保持打开状态?

由于

2 个答案:

答案 0 :(得分:1)

通常,打开连接是一项昂贵的操作,因此现代最佳实践是保持开放。另一方面,开放连接需要资源(来自数据库)来管理,因此保持大量空闲连接打开也可能是有问题的。这种权衡通常通过使用连接池来解决。

那就是说,为什么PHP段错误更有趣。显然,超时是由长时间运行的命令(在您的情况下为CLI脚本)导致阻止Redis(mostly single threaded)访问PHP应用程序的连接。虽然这是众所周知的Redis行为,但我认为PHP(没有在客户端库中重新连接的事件)不会如此悲惨地使用它。

答案 1 :(得分:0)

您的问题的答案很大程度上取决于您的应用程序中使用redis的情况。那么,您是否应该永远关闭与空闲连接超时的连接?

一般来说,没有,你应该保持默认 - 0。为什么或何时:

  • 任何类型的长期生活应用。例如CLI脚本ot后台工作者。为什么 - phpredis没有建立重新连接功能,所以你应该自己照顾这个,或者不要空闲超时。
  • 每次处理请求或CLI脚本死亡时 - 所有连接都将由php引擎关闭。 Redis服务器关闭已关闭的客户端套接字的所有连接。你将没有像僵尸连接或类似的问题。作为扩展,phpredis在析构函数中关闭连接 - 所以你可能确定连接不会保持打开状态。

P.S。当然你可以自己实现php中的代理类重新连接。我们在高负载环境中有redis - 实际上每秒约4000个连接。在2.4版本之后,我们不使用空闲连接超时。并且没有任何类型的麻烦。