Как вы работаете с ограничениями ключа/значения memcached?

Memcached имеет ограничения длины для ключей (250?) и значений (грубо 1 МБ), а также некоторые (насколько мне известно) не очень четко определенные ограничения символов для ключей. Каков наилучший способ обойти тех, на ваш взгляд? Я использую Perl API Cache:: Memcached.

В настоящее время я сохраняю специальную строку для значения основного ключа, если исходное значение было слишком большим ( "parts: <number> " ), и в этом случае я храню < число > части с ключами с именем 1 + < main key > , 2 + < main key > и т.д. В некоторых случаях это кажется "ОК" (но беспорядочным), что не очень хорошо для других, и у него есть внутренняя проблема, из-за которой некоторые части могут отсутствовать в в любое время (так что пространство тратится впустую на то, чтобы держать остальных, а время тратится впустую, читая их).

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

Кто-нибудь придумал более элегантный способ или даже API Perl, который прозрачно обрабатывает произвольные размеры данных (и ключевые значения)? Кто-нибудь взломал сервер memcached для поддержки произвольных ключей/значений?

Ответы

Ответ 1

Сервер уже позволяет указать нужный размер:

-I            Override the size of each slab page. Adjusts max item size
              (default: 1mb, min: 1k, max: 128m)

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

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

Это зависит от ваших потребностей, и я не могу сказать вам, что лучше для вас, не зная больше о том, что вы делаете. Если вам действительно нужно что-то большее, чем 1MB, то почему мы добавили -I, хотя.

Ответ 2

$ключ = абс (crc32 ($ long_key))

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

Вау... осторожно. Хороший совет, но без особого предостережения. Это может привести к столкновениям. Конечно, это очень маловероятно, но это только когда-либо должно произойти однажды, чтобы вызвать разрушительную грудь. Вероятно, вы захотите сохранить длинный ключ с memcached и всегда дважды проверять наличие коллизий на ключ. Лучший способ справиться с ними - сохранить простой список пар с длинными/значными значениями.

Ответ 3

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

Мы записывали весь этот код непосредственно поверх memcached-клиента (мы использовали Python), поэтому на более высоком уровне все было прозрачно.

Ответ 4

Не относится к исходному вопросу, но если вы думаете о переходе на APC: его макс. len для ключей - 9727 символов. (проверено на PHP 5.3.2)

Ответ 5

$key=abs(crc32($long_key))

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