Подтвердить что ты не робот

Могут ли memcached ключи содержать пробелы?

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

4b9b3361

Ответ 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 байт.