@sferos

Как решить проблему с redis?

Суть такая: 1-ый юзер создает игровую комнату(game_id) и в нее подключается, сразу заносится в redis
client.rpush("game_id:"+game_id, username);
client.rpush("status:enable", array); //открыть комнату для подключения
.
После этого, к нему в комнату подключается 2 юзер(и последующие), так же заносится в редиску client.rpush("game_id:"+game_id, username); .
Через client.lrange узнается длина списка людей в комнате, после перебор имен и отправка клиенту.
client.lrange("game_id:"+game_id, "0", "-1", function(error, result){
for(var i=0; i<result.length;i++{
//Получаем имена
//Успешно отправляем клиенту
}
}

Далее, я пытаюсь установить ограничение на кол-во человек в комнате
if(result.length==8){
client.lrem("status:enable", "0",  array_id); //удалить комнату из "доступных к подключению".
...//основные действия
}
.
Но столкнулся с такой проблемой, что при подключении 8 игроков ничего не происходит, комната закрывается лишь при заходе 9-го юзера. При этом сам 9-ый юзер в редиску не прописывается(т.к. он зашел уже после закытия комнаты). Пробовал установить if(result==7), но тогда комната закрывается при 8 юзерах, а последний(8) в redis отсутствует. Проводил проверки через консоль, ошибок вроде не находил. т.е. если в комнате есть 8 человек, то список из 8 человек так и прописан. Но node почему-то желает нового подключения для закрытия. Код массивный, если нужны будут дополнительные сведения, то пишите.
  • Вопрос задан
  • 337 просмотров
Решения вопроса 1
@yeti357
У вас не очень понятна последовательность client.rpush и client.lrange
Если у вас асинхронные запросы не последовательно выполняются, вполне вероятна ситуация, что сперва выполняется lrange, а затем только rpush.
Пришёл 8 пользователь, проверил lrange == 7, не закрывает комнату. Далее выполняется rpush.
Далее приходит 9й пользователь и тогда lrange становится 8 и закрывается комната
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vitali1995
@vitali1995
Почему бы не использовать socket.io? Там есть встроенная поддержка аутентификации с возможностью работать с персональными данными (set/get по строковому ключу). Кроме этого, обмен через сокеты происходит быстрее, чем http запросы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы