1

问题

大家好,

在这些情况下尝试与 Redis 交互时遇到问题:

  1. 带有Redisearch 模块的Redis 实例,
  2. 在 Redis 模块分叉进行之前创建node-redis客户端,
  3. Redis 模块分叉正在进行中

我得到的行为是“send_command”保持空闲状态,直到分叉停止。当叉子结束时,我收到此错误:

调试模式->

Redis connection is gone from end event

客户端错误->

AbortError: Redis connection lost and command aborted. It might have been processed.

在我收到此错误后,来自同一客户端的命令(不创建新客户端)恢复正常。

在每个叉子上,我都有相同的行为。

附加信息:

keys: 37773168,
used_memory_human: '87.31G'

代码示例:

这是一个简单的快递应用,

'use strict';
const express = require('express');
const Redis = require('redis');
// Redis.debug_mode = true;
const router = express.Router();

let client = null;

router.get('/redisearch/connect', async (req, res, next) => {
    const conf = {
        'host': '127.0.0.1',
        'port': 6379,
        'db': 0,
    };

    try {
        if (!client) client = Redis.createClient(conf.port, conf.host, { db: conf.db });
        res.send('Connected');
    } catch (err) {
        res.send(err);
    }
});

router.get('/redisearch/d', async (req, res, next) => {
    const num = 10;
    const dArgs = ['testIndexName', `@ic:[${num} ${num}]`, 'GROUPBY', 1, '@d'];

    try {
        client.send_command('FT.AGGREGATE', dArgs, (err, reply) => {
            if (err) {
                res.send({ err: err });
            };
            res.send({ d: reply });
        });
    } catch (err) {
        res.send(err);
    }
});

module.exports = router;

这是我必须复制问题的最简单方法。

我不知道是否有办法强制 redis 使用 fork,在我的情况下,它出现在对索引进行大量搜索之后,然后删除和插入记录。

然而,Redis 在这些操作(插入/删除)期间正常工作,我可以从 redis-cli 启动命令;

通过在分叉存在时创建 node-redis 客户端的新实例,一切正常,当分叉消失时,一切都继续工作。

环境

  • Node.js 版本v14.15.1
  • Redis 版本 6.0.4
  • 重新搜索版本 1.6.15
  • 节点redis版本3.2
  • 平台Server 128GB RAM, 8 Core, Debian
4

0 回答 0