Как запоминать последний визит пользователя?

Всем привет. Подскажите, какой-то хороший и быстрый способ, чтобы отображать на сайте или в приложении, что пользователь онлайн?
У меня приложение android и iphone. Я на каждый запрос пользователя, делал запрос в БД, где сохранял время последнего визита. Но потом понял, что обновлять записи в таблицах, это времязатратно. Обновление происходит за 15мс, что в масштабах всего запроса, сильно долго, ведь все get запросы выполняются гораздо быстрее в итоге весь скрипт отрабатывает за 7мс, а запрос на обновление визита, аж 15-20мс. Итого 22-27мс, вместо 7. И так на каждый запрос.
Была идея хранить где-то в redis, но тогда, после получении пользователя из бд, нужно еще лезть в redis, в общем вариантов больше нет
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
Судя по всему проблема кроется не в записи в базу данных, а в том, когда и как часто вы это делаете.

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

Правильный подход - клиентское приложение открывает и держит открытым сетевое соединение (websocket например, все браузеры поддерживают, ну а приложения могут сами ниже уровнем tcp использовать), в этом случае приложению так или иначе придется отсылать в это подключение ping пакет (keep alive таймаут) но в этом случае закрытие приложение пользователем будет отловлено в тот же миг по закрытию сетевого подключения, т.е. в базу данных на сервере не нужно ничего писать, бакэнд сможет по списку открытых подключений все сказать сам.

Да, если у пользователя смартфон - то в момент ухода в сон или из-за проблем с сетью (смена базовой станции при движении или просто рукожопство ОпСоС-ов) соединение тоже может закрыться или наоборот подвиснуть и в пределах таймаута выдавать неверную информацию (т.е. человек приложение закрыл а сервер это не отловил) но окно ошибки в этом случае будет тот же таймаут, что был бы в первом неправильном способе.
Ответ написан
Ваш ответ на вопрос

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

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