nodejs-express-以mongodb

时间:2019-01-25 01:44:03

标签: node.js mongodb express mongoose redis

我有一个简单的API,该API具有基本的CRUD operations,其中用户可以具有多个任务,并且用户登录后可以更新,删除,添加和提取所有任务。 我将MongoDBmLab用作主要数据存储区,用于存储用户和任务模式的文档。 我想在我的应用中实现Redis caching(仅出于学习目的),我可以想到的一个用例是,当我以某个特定用户的身份登录{{ 1}}在删除/更新/添加发生时经常被使用和调用。 到目前为止,该应用程序可以在getAllUserTasks上正常运行,并且文档已正确反映在MongoDB中。 现在进入Redis部分,我有一个查询,该如何构造我的Redis数据库。首先,让我发布到目前为止应用程序中的内容:

用户架构:

mLab

任务架构:

const userSchema = new Schema({
  userName: { type: String, unique: true, required: true },
  hashPassword: { type: String, required: true },
  firstName: { type: String, required: true },
  lastName: { type: String, required: true },
  userAge: { type: Number, required: true },
  userDetails: { type: String, required: true },
  userCreatedOn: { type: Date, default: Date.now }
});

getAllUserTasks函数:

const taskSchema = new Schema({
  //Below is userAssigned which is ref for above User document.
  userAssigned: { type: Schema.Types.ObjectId, ref: User},
  taskDesc: { type: String, required: true },
  taskCreatedOn: { type: Date, default: Date.now },
  taskDueDate: { type: Date, required: true }
});

现在async function getAllUserTasks(userParam) { return await Task.find({ userAssigned: userParam.userId }) .lean() .sort({ taskDueDate: "asc" }); } 为用户返回了getAllUserTasks的所有任务。 我在Google上搜索了一下,发现可以对我的Redis数据库使用Array。现在,我应该如何构造Redis数据库以高效地获取任务? 1.我是否应该将以上架构复制到Redis数据库中,并且我的任务文档将位于该数据库中。 2.如果我有一个像{Tasks'这样的https://redislabs.com/,而一个key就是我从value调用中的.find获取的任务数组。如果是这种情况,我将如何确保一旦删除/更新/添加任务,Redis数据库将相应地更新?仅供参考,以下是我的Update / Create / Delete方法:

createTask

getAllUserTasks

updateTask

async function createTask(userParam) {
  if (await User.findOne({ _id: userParam.userAssigned })) {
    const task = new Task(userParam);
    await task.save();
  } else {
    throw "User does not exist";
  }
}

deleteUserTask

async function updateTask(id, userParam) {
  return await Task.findOneAndUpdate(
    { _id: id },
    userParam,
    {
      new: true,
      overwrite: true
    },
    function(err) {
      if (err) return err;
    }
  );
}

由于我是Redis的新手,所以我们将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

您不必将所有数据存储到Redis。缓存是一种捷径。有数据很好,但是没有也没关系。

在调用getAllUserTasks时存储任务。密钥可以是用户ID。值可以是具有ID标识的任务数组。

如果某人的任务发生了变异,只需从redis中清除某人的任务即可。

getAllUserTasks(param) {
  1. Find tasks from redis by user key.
  2. If they exist, return them.
  3. If not, get data from db and store them to redis.
  4. Return data.
}