问题描述
是否可以将错误消息“已达到最大客户端数”更改为空字符串或空字符串?
我将redis用作数据库值的缓存,如果无法从缓存中获取值,我将从数据库中获取它。 如果我可以在redis it self中对其进行配置,那对我来说将是最好的选择,因为无需更改代码即可支持这种极端情况。
如果有人对如何避免此类错误有一些提示,那也将很不错:)(我正在使用带有predis软件包的PHP脚本)
解决方法
错误消息max number of clients reached
清楚地表明Redis已达到客户端限制,无法处理任何新请求。
- 此问题可能与代码中
Predis\Client
的错误使用有关。而是一次创建一个连接对象(singleton
),并在整个过程生命周期内使用它。该代码可能会在对Redis的每次请求中创建一个 new 对象,并使所有这些连接保持打开状态。 - 还有另一件事需要检查Web服务器如何管理
php
进程。 Web服务器(例如apache prefork
,nginx php-fpm
)可能会长时间离开进程,以保持与Redis的连接并耗尽服务器资源(mem,cpu)。 - 如果上面没有什么是真的-问题(错误)可能在
predis
库中。
底线:代码/ Web服务器耗尽maxclients
的限制。
如果您无法控制代码/ Web服务器(例如nginx
),则可以减少以下错误消息的数量:
- 将
maxclients
增加10k以上(取决于您的Redis服务器资源)。这样可以减少错误消息的出现频率。 - 考虑启用(默认情况下禁用)连接
timeout
(请谨慎使用,因为您的代码可能会假设连接永远不会超时)。这将从连接池释放旧连接。 - 将
tcp-keepalive
从300
秒减少到少于timeout
。这将关闭与dead peers
的连接(即使看起来连接也无法访问的客户端)。