nodejs-express - реализовать кэширование Redis в основной базе данных как mongodb - PullRequest
0 голосов
/ 25 января 2019

У меня есть простой API с базовым CRUD operations, где у пользователя может быть несколько задач, и как только пользователь войдет в систему, он сможет обновить, удалить, добавить и выбрать все задачи.Я использую MongoDB с mLab в качестве основного хранилища данных для хранения документов для схем пользователей и задач.Я хочу реализовать 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 как «Задачи», а value будет Массивом Задач, которые я получаю от .find при вызове getAllUserTasks.Если это так, как я буду следить за тем, чтобы после удаления / обновления / добавления задач база данных Redis обновлялась соответствующим образом?Ниже для справки приведены мои методы обновления / создания / удаления:

createTask

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

updateTask

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

deleteUserTask

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

AsЯ новичок в Redis, любая помощь будет очень признательна.Спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Вам не нужно хранить все данные в Redis. Кэш - это своего рода ярлык. Хорошо, если есть данные, но не имеет значения, если их нет.

Сохранение задач при вызове getAllUserTasks. Ключ может быть идентификатором пользователя. Значением может быть массив задач с идентификатором.

Если чьи-то задачи видоизменены, просто удалите чьи-либо задачи из 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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...