node.js - NodeJS - Redis 连接事件

标签 node.js events redis database-connection

我的目标如下:

  • 仅在程序开始时一次连接到 Redis 实例。
  • module.exports 连接方法,以便文件可以require此对象并启动连接。然后,生成的客户端将“传递”给其他模块。
  • 如果连接中断,则会引发相应的异常并进行相应的处理。

我可以让前两个工作。但是,我不确定如何在我的项目源中处理其他地方的 Redis 事件。

示例:

connect-once.js 我正在使用异步进行连接,以便调用函数可以等待连接完成。

const redis = require('redis')
//
async function clientOperations(options) {
    let connObject = {}
    let redisClient = redis.createClient(options)
    return new Promise((resolve, reject) => {
        redisClient.on('error', (err) => {
            connObject = {
                cacheClient: {},
                connected: false
            }
            reject(connObject)
        })
        //
        redisClient.on('connect', () => {
            connObject = {
                cacheClient: redisClient,
                connected: true
            }
            resolve(connObject)
        })
    })
}
//
async function connect(options) {
    return new Promise(async (resolve, reject) => {
        try {
            let p = await clientOperations(options)
            resolve(p)
        } catch(e) {
            reject(e)
        }
    })
}
//
module.exports = { connect }

init.js

const cache = require('connect-once')
let cacheClient = await cache.connect()
//
const bizlogic = require('some-biz-logic')
await bizlogic.addcustomer({cacheClient : cacheClient, payload : express.req.payload})

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

最佳答案

我建议使用 ioredis 而不是 redis npm 我 ioredis https://github.com/luin/ioredis#auto-reconnect

默认情况下,当与Redis的连接丢失时,ioredis会尝试重新连接,除非连接关闭 通过 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;
  }
});

示例connect-once.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 }

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

相关文章:

java - Java 1.6 上的 SIGSEGV 0xb 和 Ubuntu 上的 1.7

c# - 并行事件处理器

javascript - 为什么 this.name 未定义?

Java 套接字权限被拒绝 : connect

python - 在 Redis 上分页 "KEYS"命令

javascript - 异步等待在带有回调的函数调用中无法正常工作

javascript - Mongoose.js 和使用 Regexp 的查询对象

redis - Redis 数据库中的 ZSET 是什么?

node.js - 使用 Greenlock-Express 的通配符域的无效 SNI 错误

javascript - 绑定(bind)就绪功能和调整大小事件