клиент memcached выдает java.lang.IllegalArgumentException: ключ содержит недопустимые символы - PullRequest
4 голосов
/ 31 июля 2011

Кажется, клиент memcache не поддерживает строку UTF-8 в качестве ключа.Но я должен использовать i18n.В любом случае, чтобы это исправить?

java.lang.IllegalArgumentException: ключ содержит недопустимые символы: `` HK: 00: A Kung Wan '' в net.spy.memcached.MemcachedClient.validateKey (MemcachedClient.java: 232) at net.spy.memcached.MemcachedClient.addOp (MemcachedClient.java:254)

Ответы [ 2 ]

12 голосов
/ 01 августа 2011

Проблема здесь не в кодировке UTF.Это тот факт, что ваш ключ содержит пробел.Ключи не могут содержать пробелы, новые строки, возврат каретки или нулевые символы.

Строка кода, которая создает исключение, находится ниже

if (b == ' ' || b == '\n' || b == '\r' || b == 0) {
    throw new IllegalArgumentException
        ("Key contains invalid characters:  ``" + key + "''");
}
0 голосов
/ 20 мая 2016

Base64 Кодируйте ваш ключ непосредственно перед передачей его в методы set () и get () клиента memcached.

Общее решение для обработки всех ключей memcached со специальными символами, управляющими символами, новыми строками, пробелами, юникодомсимволы и т. д. должны кодировать ключ base64 непосредственно перед передачей его в методы set () и get () memcached.

// pseudo code for set
memcachedClient.set(Base64.encode(key), value);

// pseudo code for get
memcachedClient.get(Base64.decode(key), value);

Это преобразует их в символы, которые memcached гарантированно поймет.Кроме того, кодирование base64 не снижает производительность (если вы не специалист по оптимизации производительности nano), base64 надежен и занимает всего около 30% дополнительной длины.

Работает как шарм!

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