如何在 Redis 上杀死 Node 打开的空闲客户端?

Posted

技术标签:

【中文标题】如何在 Redis 上杀死 Node 打开的空闲客户端?【英文标题】:How to kill idle clients opened by Node on Redis? 【发布时间】:2017-07-31 23:58:31 【问题描述】:

我很难自动关闭 Redis 的客户端连接。 redis 包肯定有问题:

(https://www.npmjs.com/package/redis)

Redis 将保持连接处于活动状态,直到您关闭它们或达到默认为无限的超时。

我知道这一点:

how do I kill idle redis clients

甚至在阅读 SO 之前,我尝试通过 .conf 文件和命令行设置 timeout 配置,但它们都不起作用。

实际发生的事情很奇怪:

如果我在 N 秒后运行 CLIENT LIST

仍然存在相同数量的空闲连接 客户端“空闲”信息从 0 重新启动(例如,如果我设置 10 秒超时,11 秒后idle 信息为 1)。 地址发生变化。端口号会在创建新连接时更改,以免丢失该客户端。 客户端实际上是附加到 Node.js 上的。这似乎是一个新的节点进程。如果我保持节点应用程序 UP,则连接不会消失。如果我关闭应用程序,它创建的所有连接都会关闭。所以redis 模块可能正在“重新启动”连接。

关于我不应该强迫被杀死的客户“复活”的任何想法?

Obs:我知道我可以使用 'quit()' 关闭客户端的连接,但我必须确保它会在一段时间后摆脱应用程序未关闭的任何空闲客户端。

【问题讨论】:

various options 用于配置客户端在其连接被服务器关闭时的行为(默认是重新连接,这就是您所看到的)。但是,为什么节点代码会创建(我假设是)太多的连接?为什么不只是一个连接并重用它?如果这不可能,为什么客户端没有正确关闭连接? @robertklep 我同意如果正确完成,不应该为每个请求打开一个新客户端。需要代码才能查看您做错了什么。 大家好。我想确保,即使应用程序无法关闭连接(现在它正在这样做,在我对代码进行了一些更改之后),旧的也不会永远存在。所以我想以某种方式从应用程序中删除所有责任 @robertklep 我读了这篇文章,但是我应该更改什么选项以使其不“重试”或不“重新连接”?没找到 【参考方案1】:

为了防止节点 redis 重新连接,我将密钥 retry_strategy 传递给 createClient。

它必须是一个返回false或抛出Error的函数

【讨论】:

以上是关于如何在 Redis 上杀死 Node 打开的空闲客户端?的主要内容,如果未能解决你的问题,请参考以下文章

Java牛客项目课_仿牛客网讨论区_运行牛客讨论区项目要做的

Node.js 进程在 aws 实例上被杀死

如何在 node.js 中杀死生成的进程

MySQL 在 node.js 服务器上的空闲时间后给出“读取 ECONNRESET”错误

节点立即被杀死 - MacOS

Node.js:Jest + redis.quit() 但打开句柄警告仍然存在