Node.js NodeJS-Redis连接事件

Node.js NodeJS-Redis连接事件,node.js,events,redis,database-connection,Node.js,Events,Redis,Database Connection,我的目标如下: 仅在程序开始时连接到Redis实例一次 module.导出连接方法,以便文件可以需要此对象并启动连接。然后将生成的客户端“传递”到其他模块 如果连接断开,则会引发相应的异常并进行相应的处理 我可以让前两个开始工作。但是,我不确定如何处理我的项目源代码中其他地方的Redis的其他事件 例如: connectonce.js我正在使用async进行连接,以便调用函数可以等待连接完成 const redis=require('redis')) // 异步函数clientOperati

我的目标如下:

  • 仅在程序开始时连接到Redis实例一次
  • module.导出连接方法,以便文件可以
    需要此对象并启动连接。然后将生成的客户端“传递”到其他模块
  • 如果连接断开,则会引发相应的异常并进行相应的处理
我可以让前两个开始工作。但是,我不确定如何处理我的项目源代码中其他地方的Redis的其他事件

例如:

connectonce.js
我正在使用
async
进行连接,以便调用函数可以
等待连接完成

const redis=require('redis'))
//
异步函数clientOperations(选项){
让connObject={}
让redisClient=redis.createClient(选项)
返回新承诺((解决、拒绝)=>{
redisClient.on('error',(err)=>{
connObject={
cacheClient:{},
连接:false
}
拒绝(对象)
})
//
redisClient.on('connect',()=>{
connObject={
cacheClient:redisClient,
连线:对
}
解析(对象)
})
})
}
//
异步函数连接(选项){
返回新承诺(异步(解析、拒绝)=>{
试一试{
设p=等待客户端操作(选项)
决议(p)
}捕获(e){
拒绝(e)
}
})
}
//
module.exports={connect}
init.js

const Redis = require('ioredis');

let connObject;

//
async function clientOperations(options) {
    if (connObject && connObject.connected) {
        return connObject;
    }
    let redisClient = Redis({
        host: options.host,
        port: options.port,
        password: options.password,
        lazyConnect: true,
    });
    await redisClient.connect();
    connObject = {
        cacheClinet: redisClient,
        connected: true
    }
    return connObject;
}

//
async function connect(options) {
    return clientOperations(options);
}
//
module.exports = { connect }
const cache=require('connect-one')
让cacheClient=wait cache.connect()
//
const bizlogic=require('some-biz-logic')
wait bizlogic.addcustomer({cacheClient:cacheClient,payload:express.req.payload})

在上面的代码片段中,当Redis连接在
bizlogic.addcustomer
中断开时会发生什么情况?也许,我也在想“程序编程”。我很想知道如何连接一次,如何与项目的其他部分共享连接,以及如何在项目的某个地方使用该连接时处理任何连接错误。

我建议使用ioredis而不是redis
npm i ioredis

默认情况下,ioredis将在与Redis的连接丢失时尝试重新连接,除非连接关闭 通过redis.disconnect()或redis.quit()手动执行

使用retryStrategy选项可以非常灵活地控制断开连接后等待重新连接的时间:

var redis = new Redis({
  // This is the default value of `retryStrategy`
  retryStrategy: function(times) {
    var delay = Math.min(times * 50, 2000);
    return delay;
  }
});
示例
connectonce.js

const Redis = require('ioredis');

let connObject;

//
async function clientOperations(options) {
    if (connObject && connObject.connected) {
        return connObject;
    }
    let redisClient = Redis({
        host: options.host,
        port: options.port,
        password: options.password,
        lazyConnect: true,
    });
    await redisClient.connect();
    connObject = {
        cacheClinet: redisClient,
        connected: true
    }
    return connObject;
}

//
async function connect(options) {
    return clientOperations(options);
}
//
module.exports = { connect }

redis
软件包也会自动重新连接。事实上,它也会为相同的对象发出事件。ioredis:一款令人愉悦、注重性能、功能齐全的Redis客户端。支持群集、Sentinel、管道和Lua脚本()。对象是共享的。默认情况下,每重试20次,所有挂起的命令都将刷新一次,并显示一个错误。这样可以确保在连接断开时,命令不会永远等待。您可以通过设置maxRetriesPerRequest来更改此行为。我认为这可能已经过时,或者与typescript的工作方式不同。还是有用的,谢谢。