Redis hGet 方法在异步调用时在第二次调用时陷入死锁
Posted
技术标签:
【中文标题】Redis hGet 方法在异步调用时在第二次调用时陷入死锁【英文标题】:Redis hGet method goes to deadlock on second call when called asynchronously 【发布时间】:2019-08-31 23:50:00 【问题描述】:问题是 getMasterData 在调用时从不打印“通过最糟糕的障碍”:(。天知道我做错了什么。这就是我真正想要实现的目标。
我在这里做错了什么? 请告诉我。任何帮助将不胜感激。
下面是我的node redis实现的实现:
如果我在循环中运行相同的 this.getAll() 而没有任何等待,它会完美运行。
第二次等待它永远不会从 this.cacheStore.getByKey('organizations') 返回并永远陷入死锁。
没有错误,也没有响应。
另外,如果我删除 data2 等待。不过,它工作正常。
async setKey(key, data)
try
const flatteredData = JSON.stringify(data);
return this.cacheStore.hmset(key, key, flatteredData);
catch (error)
return error;
getByKey(key) // eslint-disable-line consistent-return
return new Promise((resolve, reject) =>
this.cacheStore.hget(key, key, (err, res) =>
if (err)
reject(err);
else
resolve(JSON.parse(res));
);
);
async getAll()
const cache = await this.cacheStore.getByKey('organizations');
if (cache) return cache;
const organizations = await this.db
.collection('organizations')
.find()
.toArray();
await this.cacheStore.setKey('organizations', organizations);
return organizations;
async getMasterData()
const data1 = await this.getAll();
const data2 = await this.getAll();
console.log('Passed the worst barrier');
【问题讨论】:
【参考方案1】:您将setKey()
声明为async
函数,但是当您在getAll()
中调用它时,您忘记了await
。
删除async
或使用await
调用它。我不确定这会解决您的错误,但请尝试一下!
【讨论】:
啊!好吧,谢谢你。但实际上,一旦我等待 this.cacheStore.getByKey('organizations') (第二次不是第一次),它就会陷入僵局,没有错误没有响应,永远消失了。这似乎是一种非常奇怪的行为。以上是关于Redis hGet 方法在异步调用时在第二次调用时陷入死锁的主要内容,如果未能解决你的问题,请参考以下文章
React 登录错误消息在第一次调用时返回未定义,然后在第二次调用时显示错误