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 登录错误消息在第一次调用时返回未定义,然后在第二次调用时显示错误

Spring Method Level Security 在第二次调用时失败

Angular 2调用多个异步方法

RestKit - 仅在第二次调用时将缓存保存到核心数据

UIView 仅在第二次调用后显示

为啥我在第二次运行测试时在 Mongoose 中收到错误“一旦编译后无法覆盖模型”?