Могут ли ключи memcached содержать пробелы? - PullRequest
20 голосов
/ 29 апреля 2011

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

Ответы [ 5 ]

41 голосов
/ 04 июля 2012

Более точный ответ (на который ссылается Дастин, но на который нет ссылок):

Ключи

Данные, хранящиеся в memcached, идентифицируются с помощью ключа. Ключ текстовая строка, которая должна однозначно идентифицировать данные для клиентов которые заинтересованы в хранении и извлечении его. В настоящее время ограничение длины ключа установлено в 250 символов (конечно, обычно клиентам не нужно было бы использовать такие длинные ключи); ключ не должен включать управляющие символы или пробелы.

Источник: protocol.txt ( Специальная версия )

21 голосов
/ 29 апреля 2011

Нет. Ключи Memcached не могут содержать пробелы.

2 голосов
/ 20 мая 2016

Клиенты 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;
}
1 голос
/ 22 марта 2012

В настоящее время я играю с memcached с PHP и описанная проблема IMHO может быть легко решена с помощью алгоритмов хеширования, таких как md5 и sha1 (или любой другой).

Я использую комбинациюmd5-hash, sha1-hash и sha256 + длина данного ключа.Очевидно, этот метод может быть уменьшен до двух хеш-методов + длина ключа, так что вы можете легко избежать использования пробела или других символов, которые не должны быть в ключе.

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

0 голосов
/ 08 января 2015

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

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