node.js - 基于 Node.js 事件循环关闭 Redis 连接

标签 node.js redis aws-lambda node-redis

问题/我是如何遇到它的

我正在用 Node.JS 编写一个批处理 Lambda 函数,它在两个不同的地方调用 Redis。一些批处理项可能永远不会到达第二次 Redis 调用。这一切都是异步发生的,所以如果我在批处理队列为空时立即关闭连接,任何 future 的 Redis 调用都会失败。如何关闭连接?

我尝试过的

我目前在做什么

一旦批处理队列为空,我调用:

intervalId = setInterval(closeRedis, 1000);

我关闭 Redis 连接并在超时后清除回调中的间隔:

function closeRedis() {
    redis.client('list', (err, result) => {
        var idle = parseClientList(result, 'idle');

        if (idle > timeout) {
            redis.quit();
            clearInterval(intervalId);
        }
    });
}

这种方法大部分可行,但如果只是检查超时,仍有可能其他进程正在进行,并且将来可能会调用 Redis。当事件循环中只剩下一个空闲连接时,我想关闭连接。有办法做到这一点吗?

最佳答案

我最终使用了 process._getActiveHandles()。一旦批处理队列为空,我将设置一个时间间隔以每半秒检查一次是否只剩下最少的进程。如果是这样,我取消引用 redisClient。

redisIntervalId = setInterval(closeRedis, 500);

// close redis client connection if it's the last required process
function closeRedis() {
    // 2 core processes plus Redis and interval
    var minimumProcesses = 4;
    if (process._getActiveHandles().length > minimumProcesses)
        return;

    clearInterval(redisIntervalId);
    redisClient.unref();
}

这种方法的优点是我可以确定 Redis 客户端不会在其他重要进程正在运行时关闭连接。我还可以确定,在所有重要流程完成后,客户端不会让事件循环保持事件状态。

缺点是 _getActiveHandles() 是一个未记录的 Node 函数,因此它可能会在以后更改或删除。此外,unref() 是实验性的,在关闭连接时不考虑某些 Redis 命令。

关于node.js - 基于 Node.js 事件循环关闭 Redis 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48108232/

相关文章:

javascript - 如何清理 Node js 中的输入值?

node.js - Node fs 显示该文件不是目录

redis - 有没有办法在redis中获取客户端IP?

c# - ServiceStack 的 RedisTypedClient - 可以使用字符串来定义类型吗?

amazon-web-services - AWS Lambda 并行执行如何与 DynamoDB 配合使用?

javascript - 如何在使用 Lambda@Edge 函数将网站从 Cloudfront 服务到私有(private) S3 存储桶时显示自定义 404 错误页面

java - Lambda 函数输出为对象

node.js - Nodejs调试-自动生成错误信息

javascript - 路由文件无法在 Express.js 中更新

database - 使用 redis 中的 evalsha 调用 lua 存储过程时遇到问题