Стратегия кеширования, когда кеширование становится бессмысленным? - PullRequest
14 голосов
/ 06 августа 2010

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

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

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

Я знаю, что это несколько аппаратный вопрос, но, вообще говоря, при каком объеме файлов кеширование становится несколько бессмысленным?То есть, если вы загружаете файловую систему всеми этими крошечными файлами, становится ли доступ к ним в конечном итоге настолько медленным, что вы могли бы просто не кэшировать информацию для начала?

Спасибо всем,Я заинтересован в любых мнениях, которые вы можете предложить

РЕДАКТИРОВАТЬ: Основываясь на ответах относительно того, что это абсолютно конкретного приложения, позвольте мне поставить вопрос таким образом, который должен быть универсальным:

Предполагая, чтоУ меня есть приложение, которое зависит от одной таблицы с 1 000 000 элементов в ней ...

Быстрее ли выполнить запрос для получения одного из этих элементов непосредственно из базы данных или для получения одного из этих элементов измой каталог кеша с 1 000 000 файлов, каждый из которых содержит сведения об одном из этих элементов?

РЕДАКТИРОВАТЬ: Очевидно, что 100 000 было недостаточно, чтобы получить правильный ответ, давайте сделаем его 1 000 000.Кто-нибудь хочет пойти на 1 000 000 000?Потому что я могу это сделать ...

Ответы [ 3 ]

10 голосов
/ 06 августа 2010

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

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

Например, не вошедший в систему пользователь может получить полную страницу прямо из кэша.Но вошедший в систему пользователь может не иметь возможности (из-за имени пользователя и т. Д.).Так что для него вы можете иметь возможность отображать 1/2 ваших просмотров на странице из кэша (так как они не зависят от объекта пользователя).Вы по-прежнему получаете выгоду от кэширования, но оно будет многоуровневым в зависимости от необходимости.

Если вы действительно ожидаете большого трафика, определенно стоит обратить внимание на Memcached.Позвольте MySQL хранить ваши запросы для вас, а затем хранить все элементы пользовательского кэша в memcache ...

Редактировать: Чтобы ответить на ваши изменения:

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

Но поймите, что если вы добавите другой сервер, у вас будет дублирование кэша (что не очень хорошо), или вам придетсяпереписать весь слой кешаЕсть ли причина не использовать Memcached с самого начала?

РЕДАКТИРОВАТЬ 2: Чтобы ответить на ваше последнее изменение:

Слишком сложно позвонить.У меня есть приложение, в котором есть база данных с примерно 1,5 миллиардами строк (рост около 500 тысяч в день).Мы вообще не используем кеширование, потому что у нас нет проблем с параллелизмом.И даже если бы мы это сделали, нам было бы лучше использовать больше серверов MySQL, чем добавлять кеширование, поскольку любая форма кэша имела бы такую ​​низкую частоту обращений, что не стоило бы времени на ее добавление.

И вот почему я так непреклонен в том, чтобы не кэшировать скорость.Всегда будет объект, который не находится в кеше.Так что, если вы попадаете на страницу с одним из этих объектов, она все равно должна быть быстрой.Как правило, я пытаюсь кэшировать все, к чему снова будет получен доступ в течение следующих нескольких минут (в любом случае я оставляю время для работы в других приложениях около 5 минут).Поэтому, если за этот промежуток времени предметы получают не более нескольких обращений или если процент попаданий очень низок (менее 90%), я не буду беспокоиться о кешировании этого предмета ....

2 голосов
/ 06 августа 2010

Общее правило: не кэшируйте, пока это не нужно, и кэшируйте только те вещи, которые необходимо кэшировать.

0 голосов
/ 06 августа 2010

Это зависит как от оборудования, так и от приложения. Вам необходимо выполнить тесты, чтобы определить порог, при котором индексирование ОС становится больше, чем продолжительность хранения / извлечения данных (как на уровне MySQL, так и на уровне доступа к кэшированным файлам). И вам также нужно сравнить это с приемлемым (очень субъективным) порогом вашей аудитории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...