memcached客户端抛出java.lang.IllegalArgumentException:密钥包含无效字符

时间:2011-07-31 19:02:44

标签: utf-8 memcached

似乎memcache客户端不支持UTF-8字符串作为其密钥。但我必须使用i18n。无论如何要解决它?

  

java.lang.IllegalArgumentException:键包含无效字符:``HK:00:A Kung Wan''   在net.spy.memcached.MemcachedClient.validateKey(MemcachedClient.java:232)   在net.spy.memcached.MemcachedClient.addOp(MemcachedClient.java:254)

2 个答案:

答案 0 :(得分:12)

这里的问题不是UTF编码。这是你的密钥包含空格的事实。键不能包含空格,换行符,回车符或空字符。

产生异常的代码行在

之下
if (b == ' ' || b == '\n' || b == '\r' || b == 0) {
    throw new IllegalArgumentException
        ("Key contains invalid characters:  ``" + key + "''");
}

答案 1 :(得分:0)

Base64在将密钥传递给memcached客户端的set()和get()方法之前对其进行编码。

处理具有特殊字符,控制字符,新行,空格,unicode字符等的所有memcached键的一般解决方案是在将密钥传递给set()和get()方法之前对其进行base64编码。 memcached的。

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

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

将它们转换为memcached保证可以理解的字符。 此外,base64编码没有性能损失(除非你是一个纳米性能优化人员),base64是可靠的,只需要大约30%的额外长度。

像魅力一样!