Использование redis для отправки статуса друга - PullRequest
0 голосов
/ 19 января 2019

Я искал в Интернете, чтобы узнать, как я могу отправлять статусы пользователей, такие как офлайн и онлайн, и т. Д. Только друзьям, использующим сокет io.Некоторые люди говорили, чтобы использовать Redis.поэтому я посмотрел и поиграл с этим.Я также использую mongodb для хранения друзей и пользователей.

Это мои настройки прямо сейчас:

//Status List: 
// 0 - offline
// 1 - online
// 2 - away
// 3 busy

//Set the status
redisClient.hmset ("online_status:userID", "status", "1");

//Check if someone is online
redisClient.hgetall ("online_status:userID", (err, reply) => {
  console.log(reply)
})

Хорошо, если я использую его таким образом, чтобы получить статус пользователя?или есть лучший способ сделать это?

Другой вопрос заключается в том, нормально ли продолжать цикл hgetall или есть лучший способ получить несколько статусов одновременно?

1 Ответ

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

Вы используете тип хеша для хранения отдельной информации, и вы используете hgetall для ее получения, поэтому я предполагаю, что вы еще не знакомы с типами данных redis.Итак, сначала позвольте мне кратко объяснить три типа данных, о которых я буду говорить (все типы можно найти в документации здесь https://redis.io/topics/data-types-intro):

  • Строка: простой тип ключ / значениеполучить к нему доступ с помощью set(key, value) и get(key, value)
  • Хэш: набор ключей / значений, хранящихся под одним ключом повторного ввода.Полезно для хранения атрибутов объекта, например, вы можете иметь ключ userdata: userID и имя магазина, аватар, статус ... вместе с ним.Получите доступ к нему с помощью hset(key, field, value), hget(key, field), hgetall(key)
  • . Набор: представляет собой набор уникальных строк. Доступ к нему осуществляется с помощью sadd(key, member), sismember(key, member), smembers(key)
*.1020 * Если вы собираетесь сохранить только онлайн-статус, было бы лучше использовать строковый тип с set, get и del (так как обычно большинство пользователей в автономном режиме большую часть времени, удалите их и сэкономьте место).Для этого простого ключа / значения использование redis на самом деле даже лучше, чем старый добрый memcache.

Если вы намереваетесь хранить больше пользовательских атрибутов (mood, девиз, аватар ...), вам следует переименовать его в userdata: userID "и проверьте с помощью hget("userdata:userID", "status") и используйте hgetall только для извлечения всех атрибутов.

Другим подходом может быть сохранение всех пользователей в наборе: sadd('users:online', userID) и проверка с помощью sismember('users:online', userID) или получение всех онлайн-пользователей с помощью smembers('users:online').Предположим, что вы храните всех друзей в другом наборе friends:userID, вы можете захватить всех онлайн-друзей пользователя с помощью одной команды пересечения sinter('friends:userID', 'users:online') - довольно мило и элегантно, ИМХО, но это сложно с более различными состояниями и не работает сredis-cluster.

Я бы предпочел подход SET.Несколько хетгов тоже подойдут, пока не возникнут проблемы из-за одного парня (он всегда один), который имеет тысячи контактов и постоянно обновляется.В этот момент вы все еще можете ввести некоторые ограничения дружбы или кеширования.

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