@Odrin

Как реализовать счетчик «сейчас этот товар просматривают еще N человек»?

Как бы вы реализовали такой счетчик? Как построить масштабируемое решение? Как пример - booking.com, счетчик кол-ва пользователей, просматривающий объект размещения.
  • Вопрос задан
  • 1192 просмотра
Решения вопроса 1
sarapinit
@sarapinit
Точу водой камень
На странице делать периодическую отправку состояния "объект просматривают". Складываете состояние в Redis HashSet со структурой:
название хэша = id объекта
ключ = id пользователя
значение = timestamp
Выбираете таймаут, например 5 секунд и считаете все записи старше 5 секунд невалидными.
Для построения счетчика берете количество валидных элементов в хэше для конкретного объекта.
Чтобы хэш не разрастался нужно удалять простроченные элементы т.к. Redis не умеет инвалидировать элементы хэшсета. Это можно делать периодически либо написать скрипт на lua который будет делать вставку нового элемента и одновременно удалять просроченные.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
nki
@nki
bezkart.ru готовая система лояльности
Это маркетинговая уловка. Можешь делать рандомный счетчик. Лишь бы пользователь понял, что у него есть конкуренты и быстрее купил нужный товар.
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Если решать проблему технически, то сперва надо определиться с частотой обновления или точностью. Что значит пользователь сейчас смотрит эту страницу? Активная вкладка браузера? А если он отвёл взгляд? )) И нужно ли действительно иметь такую высокую точность, какую бизнес-задачу это решает?
На вскидку есть 3 способа:
1) "дедовский": строить логи nginx таким образом, чтобы их удобно было парсить и брать число запросов на нужные страницы в интервал сканирования
2) собирать статистику на уровне роутера приложения в redis (как предложили недавно выше)
3) самый точный, но слишком накладный, это вебсокеты открывать на странице и считывать откуда они.
Ответ написан
Комментировать
@Mike_Kiyan
Юзать библиотеку SignalR, количество активных пользователей хранить в Redis Server
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы