2010-04-08 4 views
2

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

Моя первая идея состояла в том, чтобы создать 4 столбца счетчика в DB-Table элемента. Один для каждого из ежедневных, еженедельных, ежемесячных и общих и создания задания cron, который очищает ежедневный счетчик каждые 24 часа, еженедельный счетчик каждые 7 дней и так далее.

Но моя проблема заключается в том, что произойдет, если я хочу знать, какой из них наиболее просматривался в течение недели, сразу после того, как еженедельный счетчик очистился?

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

Прямо сейчас я думаю о решении с redis server, но у меня пока нет решения.

Я просто ищу общую идею здесь, но FYI Я разрабатываю это приложение в Ruby on Rails.

ответ

3

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

Чтобы уменьшить количество вставок, вы можете объединить их в свое программное обеспечение. Построение многострочной вставки, такой как here для MySQL, позволит сэкономить накладные расходы. Вам просто понадобятся ваши классы, чтобы построить вставку, как описано, и сохранить до вставки. Одна из идей - не только время, но и исправление ряда строк в пакетном режиме, что позволяет говорить не более, если сервер идет, вы теряете только количество строк хитов.

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

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

+0

Я тоже об этом подумал, но это означает, что мне нужен дополнительный стол с большим объемом доступа для записи, именно этого я и стараюсь избегать. – jigfox

+0

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

+0

Я никогда не видел этого. Я использую MySQL DB, есть ли у вас какие-либо ссылки на сайт с примером для пакетной записи в БД? – jigfox

1

Что вы можете сделать, это хранить то, что посещено, и в какую дату (временную метку), и вы будете делать это каждый раз, когда что-то посещено. Когда вы хотите получить то, что было посещено, вы выбрали те, которые были в диапазоне дат (timestamp), и добавили их вместе.

ИЛИ

Каждые из ваших ссылок будет иметь свою собственную соответствующую строку на каждый день они посетили. Если их посещают более одного раза за один день, он добавляет +1 к уже существующему значению.

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

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

Здесь есть возможность для сервера regis после просмотра какой-либо документации.

SET link_id|date => "visit_count" 

Это сохраняет link_id или что-то вы называете его вместе с date разделенным | или какой-либо символ, который необходимо использовать. В этом ключевом значении вы сохраняете visit_count.

Скажите, что вы хотите добавить удар по этой ссылке в эту дату. Вы бы GET link_id|date, а затем добавили +1 к visit_count, который он возвращает, а затем сохраните обратно, как я показал выше.

Если вы хотите, чтобы получить количество покупок на определенную дату, то вы можете использовать GET link_id|date.

Вы должны использовать рубиновые рельсы для замены link_id, date и visit_count с соответствующими значениями.

Надеюсь, это поможет вам.

+0

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

+0

К сожалению, я никогда не использовал сервер redis, поэтому я не мог сказать вам, как это сделать. Еще я добавил другую идею. –

+0

@Jens Fahnenbruck Я провел некоторое исследование и нашел некоторую информацию о сервере redis для вас и обновил свой ответ. –

0

Что вы можете сделать, так это создать таблицу под названием ViewCounters.

Будет столбец 'pageId', столбец 'day' и столбец 'views'. PageId будет соответствовать просматриваемой странице, а «день» будет соответствовать тому, на который он был просмотрен.

Каждый раз, когда просматривается страница, она находит (или создает, если еще нет) строку в таблице ViewCounters со своим pageId и текущим днем. Затем он увеличит столбец «views» для этой строки.

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

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

+0

та же проблема, как столбцы счетчика в счетных объектах , Я хочу резко сократить доступ к записи в БД. – jigfox

+0

Не уверен, что я понимаю, в чем проблема. Как вы можете получить лучше, чем писать в одну строку (которая тривиально найдена) на просмотр страницы? Изменить: Ох - вы хотите кэшировать, а затем пакетную запись. Имеет смысл. Ну, один вариант - сохранить просмотры страниц в файлах (имя, например [pageid] .data или что-то еще). Каждый день, пусть пакет cron задает запись в базу данных, а затем удаляет файлы. Затем вы только записываете в БД один раз в день. – Cam

+0

Да, я хочу кэшировать и чем писать в пакетном режиме, но я думаю, что запись в файл будет еще дороже. DB-Update – jigfox

 Смежные вопросы

  • Нет связанных вопросов^_^