1 回答
TA贡献1865条经验 获得超7个赞
您可以围绕您的 redis 连接创建一个包装器/代理,以确保所有 redis 操作都连接了 redis。如果不是,您可以抛出一个错误(您可以在调用者中处理)或返回未定义。
基本上,您可以侦听ready和error事件并更新status该包装器内的 - 标志,以便始终了解当前的连接状态。
现在,这肯定会涵盖初始连接不成功或调用之间发生断开连接的情况。问题是在您status成功检查 -flag 后断开连接的罕见情况。要解决这个问题,您可以为 redis 调用定义一个最长等待时间,如果达到超时则返回/抛出错误并忽略 redis 结果。下面是一些可以帮助您入门的基本代码:
class RedisService {
isConnected = false;
client;
constructor() {
this.client = redis.createClient();
this.client.get = promisify(this.client.get).bind(this.client);
this.client.set = promisify(this.client.set).bind(this.client);
this.attachHandlers();
}
attachHandlers() {
this.client.on("ready", () => {
this.isConnected = true;
});
this.client.on("error", (err) => {
this.isConnected = false;
console.log(err);
});
}
async tryGet(key) {
if (!this.isConnected) {
return undefined; // or throw an error
}
return Promise.race([this.client.get(key), this.wait()]);
}
async trySet(key, val) {
if (!this.isConnected) {
return undefined; // or throw an error
}
return Promise.race([this.client.set(key, val), this.wait()]);
}
wait(ms = 200) {
return new Promise(resolve => {
setTimeout(resolve, ms);
})
}
}
然后在你的来电者中你可以这样做:
async someMethodThatCallsRedisOrApi() {
let result;
try {
result = await redisService.tryGet('testkey');
} catch (e) {
console.log(e);
}
if (!result) {
result = apiService.get(...); // call the actual api to get the result
await redisService.trySet('testkey', result);
}
res.json(result)
});
添加回答
举报