Node .js | Redis缓存加载旧数据

标签 node.js mongodb caching redis

我正在尝试设置一个 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);
                    })
                }
            })
        }
    })
}

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

最佳答案

问题出在更新方法中。

当文档被传递时,传递的是旧数据而不是新数据。为了解决这个问题,我使用了传递给方法的 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);
                }
            })
        }
    });
}

关于 Node .js | Redis缓存加载旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45622516/

相关文章:

node.js - Hapi/Joi 验证错误日志

sql-server - NodeJs MSSQL 组合多个查询的结果

mongodb - 如何通过一次调用将一组对象插入 Mongoose 数组中?

javascript - 通过数组在 mongodb 中查找某个字段的文档?

c# - 通过界面投影

php - 新的 APCu APC 用户缓存是否在进程之间共享?

javascript - 从 Javascript 中的推文中删除 'RT @name'

xml - 从 nodejs 解析 XML 数据

c++ - 确定具有可变元素的优先级队列的最佳 ADT (C++)

javascript - 如何通过视频标签缓存整个视频文件以便以后离线播放?