Кажется, у меня проблемы с ключами memcached, у которых есть пробелы, хотя я не могу точно определить, что именно.
Могут ли memcached ключи содержать пробелы?
Ответ 1
Нет. Клавиши Memcached не могут содержать пробелы.
Ответ 2
Более явный ответ (упомянутый Дастином, но не связанный):
Клавиша
Данные, хранящиеся memcached, идентифицируются с помощью ключа. Ключ представляет собой текстовую строку, которая должна однозначно идентифицировать данные для клиентов которые заинтересованы в его хранении и извлечении. В настоящее время ограничение длины ключа задано на 250 символов (конечно, обычно клиентам не нужно было бы использовать такие длинные ключи); ключ не должен включать управляющие символы или пробелы.
Источник: protocol.txt (Конкретная версия)
Ответ 3
Клиенты Memcached, похоже, не проверяют ключи в пользу производительности.
Обычно я создаю метод с именем createWellFormedKey($key)
и передаю возвращаемый результат методам set()
и get()
клиента memcached.
Я не использую хеширование md5 и sha1, если версия base64 не превышает 250 символов. Это связано с тем, что md5 и sha1 являются более дорогими операционными характеристиками.
Пример кода PHP выглядит следующим образом:
/**
* Generates a well formed key using the following algorithm:
* 1. base64_encode the key first to make sure all characters are valid
* 2. Check length of result, less than 250 then return it
* 3. Length of result more than 250 then create a key that is md5($validKey).sha1($validKey).strlen($validKey)
*/
private function createWellFormedKey($key) {
// Get rid of all spaces, control characters, etc using base64
$validKey = base64_encode($key);
$validKeyLength = strlen($validKey);
// 250 is the maximum memcached can handle
if (strlen($validKey) < 250) {
return $validKey;
}
$validKey = md5($validKey).sha1($validKey).$validKeyLength;
return $validKey;
}
Ответ 4
В настоящий момент я играю с memcached с PHP, и описанная проблема IMHO может быть легко решена с использованием хеш-алгоритмов, таких как md5 и sha1 (или любые другие).
Я использую комбинацию md5-hash, sha1-hash и sha256 + длину указанного ключа. Очевидно, этот метод можно свести к двум хэш-методам + длине ключа, поэтому вы можете легко избежать использования пробелов или других символов, которые не должны находиться в ключе.
По-моему, избегают хэш-коллизий, потому что вероятность того, что оба алгоритма хэша имеют столкновение, равна почти нулю. Кроме того, используя длину ключа в ключе, проблема столкновения равна 0.
Ответ 5
Приложения, использующие двоичный протокол memcached, могут использовать ключи, содержащие пробелы, хотя все еще существует ограничение на длину в 250 байт.