Как записать эффективный счетчик посещений для веб-сайтов

Как насчет memcached?

Высокая Масштабируемость блог охватывает эту проблему; если будет решение с открытым исходным кодом для того, что Вы после, то это, конечно, будет там.

Другие проекты включают:

Другой хороший список: антиRDBMS: список распределенных хранилищ значения ключа

6
задан Lin 8 October 2009 в 02:12
поделиться

9 ответов

Есть два действительно простых способа:

  1. Выделить его из веб-журналов в пакетном режиме.
  2. Выполните попадания через beanstalkd или команду и попросите работника выполнять самые тяжелые вещи контролируемым образом.

Вариант 1 работает с имеющимися в наличии инструментами. Вариант 2 требует совсем немного программирования, но дает вам нечто близкое к обновлениям в реальном времени, не заставляя вас падать при скачках трафика (например, вы найдете в вашем прямом случае с mysql).

2
ответ дан 8 December 2019 в 16:05
поделиться

Вы можете взять журнал доступа своего веб-сервера (Apache: access.log) и оценивать его снова и снова (cronjob) на случай, если вам не нужны данные на рука в тот момент, когда кто-то посещает ваш сайт.

Обычно access.log создается в любом случае и содержит запрошенный ресурс, а также время, дату и IP-адрес пользователя. Таким образом, вам не нужно направлять весь трафик через php-скрипт. Скудная, средняя счетная машина.

4
ответ дан 8 December 2019 в 16:05
поделиться

Интересная тема. Увеличение счетчика, каким бы простым оно ни было, просто имеет в качестве транзакции ... это означает, что он может заблокировать всю БД на более длительный срок, чем имеет смысл! -) Это может легко стать узким местом для вся система.

Если вам нужны строго точные подсчеты, но не требуется, чтобы они мгновенно обновлялись, мой любимый подход - добавлять счетную информацию в журнал (переключая журналы по мере необходимости для обеспечения актуальности данных ). После закрытия журнала (с тысячами счетных событий в нем) сценарий может прочитать его и обновить все, что '

7
ответ дан 8 December 2019 в 16:05
поделиться

Не уверен, что это подходит вам, но AppEngine - довольно хорошая платформа для развития. Пример кода, который вы можете использовать для создания счетчика с использованием их хранилища данных и транзакций, описан здесь: http://code.google.com/appengine/docs/python/datastore/transactions.html .

0
ответ дан 8 December 2019 в 16:05
поделиться

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

Основываясь на идеях движка приложения, вы можете использовать кэш памяти в качестве временного хранилища для вашего счетчика. Увеличение счетчика кэша памяти происходит быстрее, чем использование таблиц кучи MySql (я думаю). Раз в пять или десять секунд вы можете считывать счетчик кэша памяти и записывать это число в свою БД.

1
ответ дан 8 December 2019 в 16:05
поделиться

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

Если вы не хотите хранить IP-адрес и любую другую информацию, просто число в текстовый файл может работать.

-1
ответ дан 8 December 2019 в 16:05
поделиться

Вы можете использовать Redis - это очень быстрое хранилище значений ключей с поддержкой атомарных приращений. Если возникнет необходимость - данные счетчиков можно легко разделить между несколькими серверами.

0
ответ дан 8 December 2019 в 16:05
поделиться

Я сделал нечто очень похожее, в аналогичном масштабе (несколько серверов, сотни доменов, несколько тысяч обращений в час), и анализ файлов журналов определенно был подходящим вариантом. (Он также проверял частоту попаданий, взвешивал их по типу файлов и заносил в черный список IP-адреса на брандмауэре, если они делали слишком много запросов; его предполагаемая цель состояла в том, чтобы автоматически блокировать плохих ботов, а не просто быть счетчиком, но подсчет был

Не влияет на производительность самого процесса веб-сервера, поскольку он не выполняет там дополнительной работы, и вы можете легко публиковать периодически обновляемые счетчики обращений, вводя их в базу данных сайта каждую минуту / 5 минут / 100 совпадений / что угодно, без необходимости блокировать соответствующую строку / таблицу / базу данных (в зависимости от используемого механизма блокировки) при каждом попадании.

0
ответ дан 8 December 2019 в 16:05
поделиться

Без сомнения, Redis идеально подходит для этой проблемы. Это требует около минуты для настройки и установки, поддерживает атомные природы, невероятно быстрые, имеет клиентский клиент для Python и PHP (и многие другие языки), долговечен (снимки, журнал, репликация).

Храните каждый счетчик на свой ключ. Тогда просто

INCR key
2
ответ дан 8 December 2019 в 16:05
поделиться
Другие вопросы по тегам:

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