Всегда ли предпочтителен хеш, если я всегда получаю несколько полей в Redis? - PullRequest
1 голос
/ 03 октября 2019

Допустим, я проверяю информацию о некоторых моих пользователях каждую секунду. Мне нужно предпринять действия для некоторых из тех пользователей, которые могут занять больше секунды. Примерно так:

#pseudocode
users = DB.query("SELECT * FROM users WHERE state=5");
users.forEach(user => { 
  if (user.needToDoThing()) {
    user.doThatThing();
  }
});

Я хочу убедиться, что не буду случайно запускать doThatThing для пользователя, у которого он уже запущен. Я подумываю решить эту проблему путем установки ключей кэша на основе идентификатора пользователя при обработке вещей

#pseudocode
runningUsers = redis.getMeThoseUsers();
users = DB.query("SELECT * FROM users WHERE state=5 AND id  NOT IN (runningUsers)");
redis.setThoseUsers(users);
users.forEach(user => { 
  if (user.needToDoThing()) {
    user.doThatThing();
  }
  redis.unsetThatUser(user);
});

Я не уверен, стоит ли мне ...

  • Использовать один хеш споле для пользователя
  • Использование нескольких ключей с mset и hget

Есть ли причина в производительности или бизнесе, которые я бы хотел, чтобы одна из них была другой? Я предполагаю, что мне следует использовать хеш, чтобы я мог использовать hgetall, чтобы узнать, кто работает на этом хеше, а не scan для чего-то вроде runningusers:*. Это кажется правильным?

1 Ответ

0 голосов
/ 03 октября 2019

Вообще говоря, вариант 1 ( Использовать один хэш с полем для пользователя ), вероятно, является лучшим методом в большинстве случаев, потому что вы хотите получить доступ ко всем полям для пользователей сразу. Это может быть достигнуто с помощью HGETALL.

Но когда вы переходите ко второму варианту ( используйте несколько клавиш с mset и mget ), вы хотите каждый раз запрашивать в redis, чтобы получить информацию о пользователе. Используя MGET, вы можетеполучить доступ ко всем значениям ключа, но вы хотите знать имя ключа для каждого пользователя. Это будет удобно, когда вы обращаетесь к нескольким полям объекта. Недостатки: возможно медленнее, когда вам нужно получить доступ ко всем / большинству полей для пользователей.

ПРИМЕЧАНИЕ: Используя 1-ю опцию, вы не можете установить TTL для одиночных пользователей, потому что в Redis нет поддержки TTL для дочерних ключей в хеш-структуре, единственный способ, которым вы должны установить всю хеш-функцию. Но используя 2-ю опцию, вы можетеустановить TTL для каждого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...