Прежде всего, ваш ключ состоит из множества символов. Помните, что имя ключа также занимает память (1 байт / символ), поэтому постарайтесь сделать его как можно более коротким. Я видел ситуации, когда имя ключа было больше, чем значение, что может случиться, если у вас есть случаи, когда вы храните пустой массив или пустое значение.
Структура ключа. Из вашего примера я предполагаю, что объект, который вы хотите сохранить, идентифицируется с помощью параметров (один из которых может быть идентификатором элемента или может быть фильтром для поиска [...]). Начните с префикса. Префикс должен быть именем класса объекта (или упрощенным именем, изображающим объект в целом).
В большинстве случаев ключи будут иметь префикс + идентификатор. В вашем примере у вас есть несколько идентификаторов. Если один из них является уникальным идентификатором, используйте только prefix + id
, и этого должно быть достаточно.
Если объект большой и вы не всегда используете его все, измените свою стратегию на хранилище с несколькими ключами. Используйте один главный ключ для хранения наиболее распространенных значений или для хранения компонентов объекта, значения которых хранятся в отдельных ключах. Используйте каналы и получите весь объект в одном соединении, используя один «множественный» запрос:
mainKey = prefix + objectId;
object = getFromCache(mainKey);
startCachePipeline();
foreach (object[properties] as property) {
object->property = getFromCache(prefix + objectId + property);
}
endCachePipeline();
Структура для примера объекта «Персона» будет выглядеть примерно так:
person_33 = array(
properties => array(age, height, weight)
);
person_33_age = 28;
person_33_height = 6;
person_33_weight = 150;
Memcached использует память наиболее эффективно, когда объекты, хранящиеся внутри, имеют одинаковые размеры. Чем больше разница в размерах между объектами (не говоря уже о 1 потерянном большом объекте или единичных случаях, хотя память также теряется), тем больше теряется память.
Надеюсь, это поможет!