Использование Memcache в качестве счетчика для нескольких объектов - PullRequest
4 голосов
/ 21 января 2010

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

В настоящее время у меня есть система, реализованная с использованием Memcache, но это всего лишь взлом.

Каждый раз, когда фотография просматривается, я увеличиваю ее ключ photo-hit_uuid в Memcache. Кроме того, я добавляю строку, содержащую uuid, в массив недействительности, который также хранится в Memcache. Время от времени я получаю массив недействительности, а затем циклически перебираю строки в нем, отправляя фотографии в MySQL и уменьшая их ключи Memcache.

Этот подход работает и значительно быстрее, чем прямое использование MySQL, но есть ли лучший способ?

Ответы [ 3 ]

2 голосов
/ 21 января 2010

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

0 голосов
/ 21 января 2010

Я предполагаю, что вы храните журналы доступа на своем сервере для этого решения.

  1. Отслеживайте последний раз, когда вы проверяли свои журналы.
  2. Каждые n секунд или около того (где n меньше, чем время, необходимое для вращения ваших журналов, если они есть), просматривайте последний файл журнала, игнорируя каждый удар, пока не найдете временную отметку после последней проверки .
  3. Подсчитайте, сколько раз к каждому изображению обращались.
  4. Добавьте каждый счет к счету, хранящемуся в базе данных.
  5. Сохранить отметку времени последней записи в журнале, которую вы обработали в следующий раз.
0 голосов
/ 21 января 2010

Есть способ, которым я пользуюсь.

Метод 1: (Размер файла) Каждый раз, когда кто-то попадает на страницу, я добавляю еще один байт в файл. Затем, через x секунд или около того (я установил 600), я посчитаю, сколько байтов в моем файле, удалю мой файл, а затем обновлю его до базы данных MySQL. Это также позволит масштабировать, если несколько серверов добавляют к небольшому файлу на сервере кеша. Используйте fwrite для добавления к файлу, и вам никогда не придется читать этот файл кэша.

Метод 2: (Число, хранящееся в файле) Другой метод заключается в сохранении числа в текстовом файле, который содержит количество обращений, но я рекомендую использовать это, потому что, если два процесса обновлялись одновременно, данные могут быть отключены (возможно, то же самое с method1).

Я бы использовал метод 1, потому что, хотя размер файла больше, он быстрее.

...