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.导出连接方法,以便文件可以
需要此对象并启动连接。然后将生成的客户端“传递”到其他模块
- 如果连接断开,则会引发相应的异常并进行相应的处理
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的工作方式不同。还是有用的,谢谢。