【问题标题】:node.js | Redis cache loading old data节点.js | Redis缓存加载旧数据
【发布时间】:2018-01-19 05:20:39
【问题描述】:

我正在尝试设置一个 mongo、node 和 redis 服务器,除了似乎加载旧数据的 Redis 缓存之外,所有服务器都运行良好。

取出 Redis 并使用纯 Mongo 会返回正确的数据,如果我再次单击提交,它将加载上一次提交的数据,所以我知道缓存和 Mongo 更新正常。

这是我使用 Mongo 和 Redis 更新用户的当前代码...

updateUserById: (newUser, redis, id, callback) => {
    User.findByIdAndUpdate(id, {
        $set: {
            "firstName": newUser.firstName,
            "lastName": newUser.lastName,
            "email": newUser.email
        }
    }, (err, doc) => {
        if (err) { throw new Error(err); }
        else if (!doc) { callback('No user with that ID to update cache.') }
        else {
            redis.set(id, JSON.stringify(doc), (err) => {
                console.log('Caching updated user ' + id);
                if (err) { callback(err); throw new Error(err); }
                else {
                    const result = {
                        "success": "true",
                        "message": "User updated successfully"
                    };

                    callback(result);
                }
            })
        }
    });
}

而这是redis和Mongo返回用户信息的...

userById: async (redis, id, callback) => {
    redis.get(id, async (err, reply) => {
        if (err) {
            callback(null); throw new Error(err);
        } else if (reply) {
            callback(JSON.parse(reply));
        } else {
            await User.findById(id, (err, doc) => {
                if (err || !doc) { callback(null); throw new Error(err); }
                else {
                    redis.set(id, JSON.stringify(doc), () => {
                        callback(doc);
                    })
                }
            })
        }
    })
}

我发现这与 doc 包含 updateUserById 中的旧信息有关

【问题讨论】:

    标签: node.js mongodb caching redis


    【解决方案1】:

    问题出在更新方法内部。

    传递文档时,传递的是旧数据而不是新数据。为了解决这个问题,我使用了传递给方法的 newUser。

    这是更新后的代码:

    updateUserById: (newUser, redis, id, callback) => {
        User.findByIdAndUpdate(id, newUser, (err) => {
    
            if (err) { throw new Error(err); }
            else {
                redis.set(id, JSON.stringify(newUser), (err) => {
                    console.log('Caching updated user ' + id);
                    if (err) { callback(err); throw new Error(err); }
                    else {
                        const result = {
                            "success": "true",
                            "message": "User updated successfully"
                        };
    
                        callback(result);
                    }
                })
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      使用new 选项可用于返回新文档。

      Mongo 更新后默认返回旧文档。 返回新文档 mongo 选项 new 可能有用

      用法:Model.findByIdAndUpdate(id, update, {new: true});

      updateUserById: (newUser, redis, id, callback) => {
          User.findByIdAndUpdate(id, {
              $set: {
                  "firstName": newUser.firstName,
                  "lastName": newUser.lastName,
                  "email": newUser.email
              }
          },{ new : true }, (err, doc) => {
              if (err) { throw new Error(err); }
              else if (!doc) { callback('No user with that ID to update cache.') }
              else {
                  redis.set(id, JSON.stringify(doc), (err) => {
                      console.log('Caching updated user ' + id);
                      if (err) { callback(err); throw new Error(err); }
                      else {
                          const result = {
                              "success": "true",
                              "message": "User updated successfully"
                          };
      
                          callback(result);
                      }
                  })
              }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-13
        • 2014-05-03
        • 2015-09-01
        • 2018-04-23
        • 2021-07-02
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多