是否可以将错误消息“已达到客户端的最大数目”更改为null或空字符串?我使用redis作为db值的缓存,如果无法从缓存中获取值,我将从db中获取。如果我能在redis-it-self中配置它,那对我来说是最好的选择,因为我的代码不必为了支持edge的情况而改变。如果有人对如何避免此类错误有一些建议,那也很好:)(我在predis包中使用php脚本)
nhhxz33t1#
错误消息 max number of clients reached 它清楚地表明redis已达到客户端限制,无法服务任何新请求。这个问题可能与错误使用 Predis\Client 在代码中。而是创建一个连接对象一次( singleton )并在整个进程生命周期中使用它。代码可能会在对redis的每个请求上创建一个新对象,并保持所有这些连接处于打开状态。另一件事值得一试 php 进程由web服务器管理。web服务器(例如。 apache prefork , nginx php-fpm )可能会让进程长时间保留到redis的连接并耗尽服务器资源(mem、cpu)。如果上面没有什么是真的-问题(bug)可能在 predis 图书馆。一句话:代码/web服务器 maxclients 限制。如果您无法控制代码/web服务器(例如。 nginx ),要减少错误消息的数量,您可以:增加 maxclients 超过10k(取决于您的redis服务器资源)。这将减少错误消息的频率。考虑启用(默认禁用)连接 timeout (请谨慎使用,因为您的代码可能会假定连接从不超时)。这将从连接池中释放旧连接。减少 tcp-keepalive 从 300 秒到少于 timeout . 这将关闭与的连接 dead peers (即使看起来已连接,也无法访问的客户端)。
max number of clients reached
Predis\Client
singleton
php
apache prefork
nginx php-fpm
predis
maxclients
nginx
timeout
tcp-keepalive
300
dead peers
1条答案
按热度按时间nhhxz33t1#
错误消息
max number of clients reached
它清楚地表明redis已达到客户端限制,无法服务任何新请求。这个问题可能与错误使用
Predis\Client
在代码中。而是创建一个连接对象一次(singleton
)并在整个进程生命周期中使用它。代码可能会在对redis的每个请求上创建一个新对象,并保持所有这些连接处于打开状态。另一件事值得一试
php
进程由web服务器管理。web服务器(例如。apache prefork
,nginx php-fpm
)可能会让进程长时间保留到redis的连接并耗尽服务器资源(mem、cpu)。如果上面没有什么是真的-问题(bug)可能在
predis
图书馆。一句话:代码/web服务器
maxclients
限制。如果您无法控制代码/web服务器(例如。
nginx
),要减少错误消息的数量,您可以:增加
maxclients
超过10k(取决于您的redis服务器资源)。这将减少错误消息的频率。考虑启用(默认禁用)连接
timeout
(请谨慎使用,因为您的代码可能会假定连接从不超时)。这将从连接池中释放旧连接。减少
tcp-keepalive
从300
秒到少于timeout
. 这将关闭与的连接dead peers
(即使看起来已连接,也无法访问的客户端)。