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

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

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

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

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

Ответы на вопрос(5)

This way you get unique key for queries and other long keys which may have changes beyond the 250 chars memcache sees.

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

 22 июл. 2013 г., 21:04
В (большинстве) сценариях, где вы используете memcached для кэширования данных, которые сохраняются в другом месте, вероятность коллизии сводит на нет заботу об этой программе. Простой мониторинг memcached для высокой частоты столкновений покажет вам, есть ли проблема, и только тогда стоит потратить время на поиск ключей, которые перезаписывают друг друга. Если стратегия кеширования реализована правильно, и вы сохраняете данные, которые были сохранены, ошибок не будет, только ухудшение производительности.
 23 июл. 2013 г., 20:38
Зависит от того, что вы кешируете. Если кэшируемая информация является конфиденциальной для пользователя, коллизия хеша может означать утечку личных данных (что я бы назвал ошибкой, вызывающей сокрушительный удар). Конечно, есть хэши, которые фактически делают вероятность столкновения хэшей нулевой, но crc32 не является одним из них. Требуется лишь немногим более 77000 значений, чтобы шансы столкновения хэшей были 1 к 2 (preshing.com/20110504/hash-collision-probabilities). Использование лучшей хеш-функции для ключа помогает, но каждая реализация хеш-таблицы, которую я знаю, учитывает коллизии. Это не сложно; просто храните и проверяйте ключ.
Решение Вопроса

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

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

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

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

$key=abs(crc32($long_key))

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

 01 июл. 2012 г., 04:08
Пусть столкновение будет с вами.
 11 янв. 2016 г., 19:46
Согласовано. CRC32 даст вам много коллизий, по крайней мере, используйте хеш MD5.

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

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

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

Ваш ответ на вопрос