Храните свежие данные в памяти для Socket.IO

Я создаю веб-приложение Node.js с использованием Socket.IO.
В настоящее время я использую Passport.js и его промежуточное ПО для Socket.IO, которое предоставляет мне user объект (который загружается из MySQL логикой десериализации Passport.js) аутентифицированного пользователя для каждого сокета:

io.on('connection', function (socket) {
  const user = socket.request.user;
  socket.on('event', (data) => {
    // ...
  });
});

Тем не менее, данные в user исправлено (загружается в момент подключения), поэтому я не могу использовать какие-либо "нестатические" свойства пользователя в обратных вызовах для событий сокета.
Пример: пользователь отправляет сообщение чата, и я хочу передать его в текущую комнату этого пользователя (определяется user_id поле пользователя в MySQL). Запрашивать относительно медленный MySQL каждый раз, когда происходит событие, очевидно, не вариант (я также собираюсь отправлять некоторые события много раз в секунду, например, рисование в реальном времени).

Вопрос № 1: Как правильно решить эту задачу? В настоящее время я имею в виду Redis (т.е. сохраняйте обязательные данные или дублируйте все данные в Redis и проверяйте Redis для каждого события (должно быть достаточно быстро?)).

Вопрос № 2: Если использование Redis, как я описал, является приемлемым методом, то какова лучшая практика для обработки таких дублированных данных? Я имею в виду, что любой код, который изменяет некоторые данные "Нужно быть свежим в Redis" в базе данных, теперь должен обновлять его и в Redis. Может быть, создать дополнительный уровень абстракции в коде, примерно как userService.setRoom() обновление как БД, так и Redis, и этот метод должен вызываться везде вместо прямых изменений, как раньше? Звучит как приличный объем дополнительной работы, но я не уверен в других способах достижения этого.

Заранее спасибо.

0 ответов

Другие вопросы по тегам