【问题标题】:change the 'max number of client reached' redis error message to ''将“达到的最大客户端数”redis 错误消息更改为“”
【发布时间】:2020-10-11 14:54:30
【问题描述】:

是否可以将错误消息“达到的最大客户端数量”更改为 null 或空字符串?

我使用 redis 作为我的数据库值的缓存,如果我无法从缓存中获取值,我将从数据库中获取它。 如果我可以在 redis it self 中配置它,那对我来说将是最好的选择,因为我的代码不必为了支持这种边缘情况而进行更改。

如果有人对如何避免此类错误有一些提示,那也很好:)(我正在使用带有 predis 包的 php 脚本)

【问题讨论】:

  • IMO 最好在客户端处理。如果您想这样做,您可以将该值设置为不合理的高值?
  • 我有多个客户,我不想全部更改...目前设置为 10K,您认为有多少可能?
  • 10k 已经足够了。通常客户端已经有连接池。除非不使用 conn 池,否则 100k 可能仍然不够

标签: php redis predis


【解决方案1】:

错误消息max number of clients reached 清楚地表明Redis 已达到客户端限制,无法处理任何新请求。

  • 此问题可能与代码中Predis\Client 的错误使用有关。而是创建一次连接对象 (singleton) 并在整个进程生命周期中使用它。该代码可能会在对 Redis 的每个请求上创建一个 new 对象并保持所有这些连接打开。
  • 另一件事值得检查php 进程是如何由Web 服务器管理的。 Web 服务器(例如apache preforknginx php-fpm)可能会使进程长时间保持与 Redis 的连接并耗尽服务器资源(mem、cpu)。
  • 如果以上都不是真的 - 问题(错误)可能在 predis 库中。

底线:代码/网络服务器耗尽maxclients 限制。

如果您无法控制代码/网络服务器(例如 nginx),为了减少错误消息的数量,您可以:

  • 增加maxclients 超过 10k(取决于您的 Redis 服务器资源)。这将减少错误消息的频率。
  • 考虑启用(默认禁用)连接timeout(谨慎使用它,因为您的代码可能假定连接永远不会超时)。这将从连接池中释放旧连接。
  • tcp-keepalive300 秒减少到小于timeout。这将关闭与dead peers 的连接(即使看起来已连接也无法访问的客户端)。

【讨论】:

  • 谢谢汤姆!这是非常有价值的信息,但它不能回答我的问题。我想更改返回的错误信息...
  • 哈哈!确实如此!我仍然无法理解 - 您是在日志(app/redis)中收到此错误消息还是作为 php 进程的输出?
  • 我的 php 应用程序在尝试连接到 redis 服务器时收到此消息。
  • 知道了。在这种情况下,如果您不关心所有错误。您可以禁用它们 - php.net/manual/en/… 或者如果您有权访问代码,您可以检查 predis 是否支持每个对象实例的自定义日志记录。
  • 无论哪种方式,我认为@TomLime 的回答对如何实际纠正错误非常有描述性。应用程序接收此消息是不正常的行为(我不确定您的应用程序有多大,但我们在负载均衡器后面有多个网络服务器,我们每分钟通过一个单例对 redis 进行数百甚至数千次调用服务器,我们永远不会得到这个问题)在我看来,您需要花一些时间来正确处理与 Redis 集群的连接,而不是静默捕获错误(静默捕获也很危险)
猜你喜欢
  • 2020-06-07
  • 2023-02-04
  • 2018-11-27
  • 2010-11-27
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多