首页 > 解决方案 > nodejs-express - 在主数据库上实现 Redis 缓存作为 mongodb

问题描述

我有一个简单的 API,CRUD operations其中一个用户可以有多个任务,一旦用户登录就可以更新、删除、添加和获取所有任务。我使用MongoDBwithmLab作为我的主要数据存储来存储用户和任务模式的文档。我想Redis caching在我的应用程序中实现(仅用于学习目的),我能想到的一个用例是当我为特定用户(在主页上)登录时获取任务时实现它,因为它getAllUserTasks经常被使用和调用有任何删除/更新/添加发生。截至目前,该应用程序可以正常工作,MongoDB并且文档可以正确反映在mLab. 现在来到 Redis 部分,我有一个查询,我应该如何构建我的 Redis 数据库。首先,让我发布到目前为止我的应用程序中的内容:

用户架构:

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 }
});

任务架构:

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 }
});

getAllUserTasks 函数:

async function getAllUserTasks(userParam) {
  return await Task.find({ userAssigned: userParam.userId })
    .lean()
    .sort({ taskDueDate: "asc" });
}

现在getAllUserTasks返回给我一个Array用户的所有任务。我用谷歌搜索了一下,发现我可以https://redislabs.com/用于我的 Redis 数据库。现在我应该如何构建我的 Redis 数据库以高效地获取任务?1.我是否应该将上述模式复制到 Redis 数据库,我的任务文档将存在于那里。2. 我是否应该有一个key类似的“任务”,并且 avalue将是我从通话中的 .find 获得的任务数组getAllUserTasks。如果是这种情况,我将如何确保一旦删除/更新/添加任务,Redis 数据库将相应更新?下面仅供参考是我的更新/创建/删除方法:

创建任务

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";
  }
}

更新任务

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

删除用户任务

async function deleteUserTask(id) {
  return await Task.findByIdAndRemove(id, function(err) {
    if (err) {
      return err;
    }
  });
}

由于我是 Redis 的新手,任何帮助将不胜感激。谢谢!

标签: node.jsmongodbexpressmongooseredis

解决方案


您不必将所有数据存储到 redis。缓存是一种捷径。有数据就好,没有也无所谓。

getAllUserTasks调用时存储任务。密钥可以是用户 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.
}

推荐阅读