问题
大家好,
在这些情况下尝试与 Redis 交互时遇到问题:
- 带有Redisearch 模块的Redis 实例,
- 在 Redis 模块分叉进行之前创建node-redis客户端,
- 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