我的目标如下:
- 仅在程序开始时一次连接到 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/