重用 Redis 连接:套接字意外关闭 - node-redis。

12

首先,让我告诉你如何在我的NodeJS应用程序中使用Redis连接:

  • 我使用单例类在整个应用程序中重复使用一个连接。
class RDB {

    static async getClient() {
        if (this.client) {
            return this.client
        }

        let startTime = Date.now();

        this.client = createClient({
            url: config.redis.uri
        });

        await this.client.connect();

        return this.client;
    }

}

我不知道原因,但是我的应用偶尔会崩溃,并给出没有任何原因的错误消息 - 这种情况大约每周发生一到两次:

Error: Socket closed unexpectedly

现在,我的问题:

  1. 像这样使用Redis连接是否正确?我的方法有什么问题吗?
  2. 为什么会发生这种情况?为什么我的套接字会意外关闭?
  3. 是否有一种方式可以捕获这个错误(使用我的方法),或者还有其他好的实现Redis连接的做法吗?
3个回答

9
我使用“error”监听器来解决这个问题。只需监听它-可以防止节点应用程序崩溃。
client.on("error", function(error) {
   console.error(error);
   // I report it onto a logging service like Sentry. 
});

错误信息显示程序为何崩溃了吗? - chovy

6

我遇到了一个类似的问题,就是socket意外关闭。这个问题出现在我将node-redis从3.x升级到4.x时。当我将redis-server从5.x升级到6.x后,这个问题消失了。


3
你应该声明一个 RDB 类的私有静态成员 'client',如下所示:
private static client;

在静态方法中,无法引用'this'实例,需要像这样引用静态类成员:
RDB.client

最好检查客户端的连接是否已打开,而不仅仅检查客户端是否存在(考虑使用“redis”npm库)。像这样:

if (RDB.client && RDB.client.isOpen)

变更后,您的代码应该像这样:

class RDB {
    private static client;

    static async getClient() {
        if (RDB.client && RDB.client.isOpen) {
            return RDB.client;
        }

        RDB.client = createClient({
            url: config.redis.uri
        });

        await RDB.client.connect();

        return RDB.client;
    }
}

注意:connect()方法和isOpen属性仅存在于Redis版本 ^4.0.0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接