【问题标题】:Why should I close or keep Redis connections open?为什么我应该关闭或保持 Redis 连接打开?
【发布时间】:2014-06-27 12:02:46
【问题描述】:

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

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

为了能够选择是增加连接超时还是默认为0(意思是“永不超时”),我想知道可能的优缺点是什么?

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

谢谢

【问题讨论】:

    标签: php redis segmentation-fault timeout phpredis


    【解决方案1】:

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

    一般,您应该保持默认值 - 0。为什么或何时:

    • 任何类型的长寿命应用程序。比如 CLI-script ot 后台工作者。为什么 - phpredis 没有内置重新连接功能,所以你应该自己处理这个问题,或者不要让你的空闲超时。
    • 每次处理您的请求或 CLI 脚本终止时 - 所有连接都会被 php 引擎关闭。 Redis 服务器关闭所有已关闭客户端套接字的连接。你不会有像僵尸连接或类似的问题。作为扩展,phpredis 在析构函数中关闭连接 - 因此您可以确定连接不会保持打开状态。

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

    【讨论】:

      【解决方案2】:

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

      也就是说,更有趣的是为什么 PHP 会出现段错误。显然,超时是由一个长时间运行的命令(在您的情况下为 CLI 脚本)导致的,该命令阻止了 Redis(即mostly single threaded)参与 PHP 应用程序的连接。虽然这是一个众所周知的 Redis 行为,但我希望 PHP(没有在客户端库中重新连接的事件)不会如此悲惨。

      【讨论】:

        猜你喜欢
        • 2012-02-28
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 2011-06-19
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多