Лучшие практики Memcached - маленькие объекты и множество ключей или большие объекты и несколько ключей? - PullRequest
23 голосов
/ 13 января 2009

Я использую memcached для хранения целочисленного результата сложного вычисления. У меня есть сотни целочисленных объектов, которые я могу кэшировать! Должен ли я кэшировать их под одним ключом в более сложном объекте или использовать сотни различных ключей для объектов? (объекты, которые я кеширую, не нужно аннулировать чаще, чем раз в день)

Ответы [ 6 ]

10 голосов
/ 13 января 2009

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

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

7 голосов
/ 11 апреля 2009

Я написал довольно большой анализ на http://dammit.lt/2008/12/25/memcached-for-small-objects/ - он описывает, как оптимизировать memcached для хранения небольших объектов - он может пролить некоторый свет на эту проблему.

2 голосов
/ 13 января 2009

Это зависит от вашего приложения. Хотя memcached очень быстрый, он требует некоторой передачи запросов и времени поиска памяти для каждого запроса. Эти числа увеличиваются в зависимости от того, находится ли сервер на локальном компьютере (localhost), в локальной сети или в широкой области. Размер вашего кэша обычно не влияет на скорость поиска.

Итак, если ваше приложение использует МНОГИЕ объекты на единицу обработки (на запрос, метод или что-то еще), то обычно лучше определить кэш таким образом, чтобы уменьшить общее количество обращений к кешу, пока при этом стараемся не дублировать данные кеша. Как и все остальное, это баланс.

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

1 голос
/ 21 декабря 2012

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

1 голос
/ 13 января 2009

Чем меньше обработок кэшированных значений, тем лучше. Так почему бы просто не записать их в кеш по отдельности?

0 голосов
/ 02 ноября 2011

Это зависит от того, что это за цифры. Если бы вы могли, например, сгруппировать их по диапазонам, то вы могли бы оптимизировать хранилище. Если бы вы могли хешировать их в карту или в хеш-таблицу и хранить эту карту, сериализованную в memcached, было бы хорошо.

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

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