Подсчет текущих пользователей на странице - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь посчитать текущих зрителей на конкретной странице. Мне нужно, чтобы этот счет был сохранен в БД. Основная проблема заключается в том, чтобы убрать после того, как пользователь покидает страницу.

Пользователи анонимны. Каждый активный пользователь отправляет AJAX-запрос каждые 5 секунд.

Какой лучший алгоритм для этого? Есть предложения?

UPD: Я пытаюсь сократить количество запросов к БД, поэтому, я думаю, мне не нужно на самом деле сохранять это количество в БД, пока я можно получить доступ к нему другим способом из кода.

Ответы [ 4 ]

5 голосов
/ 17 ноября 2011

Даже не думайте о сохранении этого в базе данных, ваше приложение будет невероятно замедлено.

Так что используйте Cache для такого рода операций.

Чтобы подсчитать количество людей,Я бы сказал:

  • назначить случайный идентификатор каждому анонимному пользователю и сохранить его в своем сеансе

  • отправить идентификатор в вашем вызове ajax

  • сохранить массив кешей в кеше с помощью [{ :user_id, :latest_ping }, {} ] (создать переменную кэша для каждой страницы)

  • удалить элементы массивакоторые выглядят слишком старыми

  • у вас есть решение: количество пользователей = nb элементов в массиве

2 голосов
/ 17 ноября 2011

Если вы храните пользователей в базе данных каким-либо образом, вы можете сохранить поле last_seen_at в таблице пользователей и обновить его на Time.now для каждого AJAX-запроса, который отправляет пользователь.

Чтобы отобразить, сколько у вас пользователей в данный момент, вы можете просто выполнить запрос, например:

@user_count = User.where("last_seen_at < ?", 5.seconds.ago).count

Если вы хотите очистить старых пользователей, я предлагаю запустить какое-то задание cron или использовать гем whenever, или что-то в этом роде, чтобы периодически удалять всех пользователей, которых не видели в течение некоторого времени. .

1 голос
/ 17 ноября 2011

Я бы посоветовал вам создать модель, содержащую уникальный ключ (cookie-идентификатор или что-то в этом роде), который вы сохраняете или обновляете при каждом запросе пульса AJAX.

Затем у вас есть контроллер сеанса, который может выглядеть следующим образом:

def create
  ActiveUser.where(:cookie => params[:id]) || ActiveUser.new
  ActiveUser.cookie = prams[:id]
  ActiveUser.timestamp = Time.now
  ActiveUser.save
end

Количество активных пользователей будет просто SELECT COUNT(*) FROM ActiveUsers WHERE timestamp > NOW() - 5 или что-то в этом роде.

0 голосов
/ 17 ноября 2011

Мартин Фрост на правильном пути.Существует метод #touch для обновления last_seen_at: user.touch(:last_seen_at)

Но было бы еще эффективнее просто обновить пользователя без необходимости извлекать модель из базы данных:

> User.update_all({:last_seen_at => Time.now}, {:id => params[:user_id})
SQL (3.1ms)  UPDATE "users" SET "last_seen_at" = '2011-11-17 12:37:46.863660' WHERE "users"."id" = 27
=> 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...