Redis 错误“已达到最大客户端数”

vik*_* kv 8 caching redis node.js forever

我正在使用forever npm 模块运行nodeJS 应用程序。
节点应用程序还连接到 Redis DB 进行缓存检查。API 通常会停止工作,并在永久日志中出现以下错误。

{ ReplyError: Ready check failed: ERR max number of clients reached
    at parseError (/home/myapp/core/node_modules/redis/node_modules/redis-parser/lib/parser.js:193:12)
    at parseType (/home/myapp/core/node_modules/redis/node_modules/redis-parser/lib/parser.js:303:14)
    at JavascriptRedisParser.execute (/home/myapp/ecore/node_modules/redis/node_modules/redis-parser/lib/parser.js:563:20) command: 'INFO', code: 'ERR' }

Run Code Online (Sandbox Code Playgroud)

当我在 redis 服务器上执行client list命令时,它显示太多打开的连接。我还在timeout = 3600我的 Redis 配置中进行了设置。
我的应用程序代码中没有任何未关闭的 Redis 连接对象。
根据应用程序负载,这种情况每周会发生一两次,作为权宜之计,我正在重新启动节点服务器(它可以工作)。

在这种情况下,永久的解决方案是什么?

vik*_* kv 2

我已经明白为什么了。这与Redis无关。增加操作系统文件描述符限制只是一个临时解决方案。我在 Web 应用程序中使用 Redis,并为每个新请求创建连接。

当服务器偶尔重新启动时,所有 Express 服务器保留的连接都会被释放。

我通过创建一个全局连接对象并重新使用它来解决这个问题。仅在必要时才创建新连接。

您可以通过创建一个全局连接对象,建立一次连接,并确保每次使用它之前都已连接来实现此目的。根据您的编程语言检查是否有已编码的解决方案。就我而言,它是带有 dancer 框架的 Perl,我使用了一个名为Dancer2::Plugin::Redis的模块

redis_插件

返回 Dancer2::Plugin::Redis 实例。您可以使用 redis_plugin 将插件实例传递给第 3 方模块(后端 api),以便您可以访问那里现有的 Redis 连接。您将需要访问插件实例的实际方法。

如果您没有运行 Web 服务器并且正在运行工作进程或任何后台作业进程,您可以执行这个简单的辅助函数来重新使用连接。
Perl 示例

sub get_redis_connection {
    my $redis = Redis->new(server  => "www.example.com:6372" , debug => 0);
    $redis->auth('abcdefghijklmnop');
    return $redis;
}

...

## when required
unless($redisclient->ping) {
      warn "creating new redis connection";
      $redisclient = get_redis_connection();
}
Run Code Online (Sandbox Code Playgroud)