2008-10-29 2 views
9

Каков наилучший способ реализовать счетчик просмотров страницы, как те, что у них есть здесь, на сайте, где у каждого вопроса есть счетчик «Просмотры»?Page View Counter like on StackOverFlow

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

ответ

7

Счетчик я оптимизировано работает следующим образом:

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 запроса на первый взгляд, другие виды требуют только один запрос.

+0

Одной из проблем здесь является либо a) возможность сериализации, либо b) состояние гонки - зависит от уровня изоляции транзакции. – stephbu 2008-10-29 14:24:38

+0

Правильно, одна из забот у нас есть, возможно, состояние гонки. Должно ли это выполняться асинхронно? – TimLeung 2008-10-29 14:25:35

+0

@stephbu: для вашего б) это скорее некритические условия гонки, потому что увеличение +1 не меняется, если запрос выполняется в одно и то же время ... +1 +1 или +1 +1 равно всегда +2. – 2008-10-29 14:27:02

5

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

0

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

0

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

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

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

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

0

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

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

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

11

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

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

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

3

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

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