Счетчик просмотров страницы как на StackOverFlow - PullRequest
10 голосов
/ 29 октября 2008

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

Факторинг в вопросах производительности и масштабируемости.

Ответы [ 7 ]

11 голосов
/ 29 октября 2008

Я сделал два замечания о счетчике представлений stackoverflow:

  • В заголовке есть элемент link, который обрабатывает обновление счетчика. Для этого вопроса разметка выглядит так:
    <link href="/questions/246919/increment-view-count" type="text/css" rel="stylesheet" />
    Я полагаю, что вы можете нажать на этот URL, чтобы обновить количество просмотров, даже не просматривая страницу, но я не пробовал.

  • У меня был билет на счет пользователя , где ответ Джеффа показал, что представления не увеличиваются с одного и того же ip дважды в ряд.

8 голосов
/ 29 октября 2008

Счетчик, который я оптимизировал, работает так:

UPDATE page_views SET counter = counter + 1 WHERE page_id = x
if (affected_rows == 0 ) {
   INSERT INTO page_views (page_id, counter) VALUES (x, 1)
}

Таким образом, вы запускаете 2 запроса для первого представления, для других представлений требуется только 1 запрос.

6 голосов
/ 29 октября 2008

Эффективным способом может быть: Сохраните свои счетчики в объекте Application, вы можете периодически сохранять его в файле / БД и при закрытии приложения.

4 голосов
/ 14 октября 2009

Вместо того чтобы делать вызов базы данных каждый раз, когда база данных попадает, я бы увеличивал счетчик, используя объект кэша, и в зависимости от того, сколько посещений вы получаете на свой сайт каждый день, когда вы посылаете попадания страницы в базу данных при каждом сотом обращении к сайт. Это быстрее, чем обновлять базу данных при каждом ударе.

Или другое решение - анализ файла журнала IIS и обновление обращений каждые 30 минут с помощью службы Windows. Это то, что я реализовал, и это творит чудеса.

0 голосов
/ 29 октября 2008

Для меня лучше всего иметь поле в таблице вопросов и обновлять его при обращении к вопросу

UPDATE Questions SET views = views + 1 WHERE QuestionID = x

Объект приложения: IMO не масштабируется, потому что он может закончиться большим потреблением памяти при доступе к большему числу вопросов. Таблица Page_views: нет необходимости, вы должны сделать дорогостоящее соединение после

0 голосов
/ 29 октября 2008

Я фанат стиля реализации @ Guillaume. Я использую прозрачный обработчик GIF и очереди в памяти для пакетирования наборов изменений, которые затем периодически сбрасываются с использованием отдельного потока, созданного в global.asax.

Обработчик реализует IHttpHandler, обрабатывает параметры запроса, например, идентификатор страницы, язык и т. д. обновляет очередь, а затем response. записывает прозрачный GIF.

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

Конечно, вы могли бы просто заплатить кому-то, чтобы он тоже сделал работу, например. с прозрачными гифками.

0 голосов
/ 29 октября 2008

Вы можете реализовать IHttpHandler для этого.

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