Создание счетчика посещений с использованием кэша или области приложения - PullRequest
2 голосов
/ 31 мая 2011

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

Пока у меня есть идеи:.

Идея 1

  1. Создание структуры приложения или кэша для хранения пары значений ключа pageId и pageHits.
  2. При каждом обращении к странице проверяйте наличие адреса pageId / ipcookie.
  3. a.Если он существует, ничего не делать.
  4. b.Если этого не произойдет, установите его и обновите структуру попаданий в приложении или кэше.

Проблема: Я не знаю, как периодически получать данные структуры в базу данных/ по истечении определенного времени.Запланированное событие?

Идея 2

Нет куки;сохранить pageId / IP-адрес в их собственной структуре кэша / приложения.

Проблема Я не уверен, как структурировать структуры данных / массивы для хранения информации.Кажется сложным с циклами массива и структурными находками.И у меня все еще та же проблема, что и у идеи 1.

Любой совет, идеи, критика?В частности, мне нужна помощь в выяснении структур данных для идеи 2. Меня больше интересует производительность, чем целостность данных, и я доволен решением только с CF9. Я должен добавить, что я ищу денормализацию данных в столбец посещений для каждого идентификатора страницы.Мне не нужны нормализованные таблицы данных.

Ответы [ 2 ]

5 голосов
/ 31 мая 2011

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

Используйте log = fileRead('log.txt', 'read') и периодически повторяйте line fileReadLine(log) с помощью <cfschedule/>.Для каждого пакета вы можете, как вы уже описали, и затем использовать любой подход к базе данных для INSERT / UPDATE (обычно используется ключевое слово MERGE, но MySQL отличается) на основе IP-адреса, если вы это 'после.Если это сайт с очень высоким трафиком, рассмотрите возможность изменения типа данных столбца IP-адреса на целочисленный тип данных для ускорения поиска в индексе.

Обновление

Используйте следующий код для установки ссылки на объект файла:

<cflock name="logparser" type="exclusive" timeout="1" throwontimeout="false">
    <cfif NOT structKeyExists(application, "logFile")>
        <cfset application.logFile =
            fileOpen('/path/to/log.txt', 'read')>
    </cfif>
    <cfloop condition="NOT FileisEOF(application.logFile)">
        <!--- replace with an appropriate algorithm --->
        <cfoutput>
            #fileReadLine(application.logFile)#
            <br />
        </cfoutput>
    </cfloop>
</cflock>

Выполнение этого устанавливает ссылку один раз (т. Е. fileOpen()), которая отслеживает, на какой строке он находится.Затем, когда <cfschedule/> снова попадает в этот код, он использует существующую ссылку, если она есть, и выполняет итерацию вперед оттуда.Блокировка гарантирует, что только один поток выполняет алгоритм - так что вам не нужно беспокоиться о временном ограничении, просто дайте ему продолжаться столько времени, сколько потребуется.

1 голос
/ 31 мая 2011

Идея 1: да, <cfschedule> твой друг

Идея 2: сохранить идентификатор страницы / IP-адрес? Полагаю, лучше использовать Set из Java, но struct тоже сработает, если вы присвоите ему пустое значение ...

pageIDs["1"]["192.0.0.1"] = "";
hitsOfPage1 = structCount(pageIDs[1]));

Однако, если я снова зайду на страницу, я не буду засчитан?

...