我是memcached的新手并且结识了一位老朋友Java - 我正在使用java 1.7在win x64上运行。还通过设置文件couchbase-server-enterprise_2.2.0_x86_64在我的本地win 64机器上运行couchbase memcache服务器。一切正常,直到我在telnet会话中使用密钥集进行字符串比较并在java中检查此密钥时发现奇怪的行为。
来自telnet会话
set s1 1 0 4
abcd
STORED
set s2 32 0 4
abcd
STORED
从我的主java测试类: ...
System.out.println("Get s1 from Cache:" +mcca.get("s1"));
System.out.println("Get s1 from Cache:" +mcca.get("s1",1));
System.out.println("Get s1 from Cache:" +mcca.get("s1",32));
System.out.println("Get s1 from Cache:" +mcca.get("s1",77, true));
System.out.println("Get s2 a from Cache:" +mcca.get("s2"));
System.out.println("Get s2 b from Cache:" +mcca.get("s2",1));
System.out.println("Get s2 c from Cache:" +mcca.get("s2",32));
System.out.println("Get s2 c from Cache:" +mcca.get("s2",77, true));
输出
Get s1 from Cache:97
Get s1 from Cache:97
Get s1 from Cache:97
com.danga.MemCached.MemCachedClient Mon Dec 30 11:50:06 EST 2013 - ++++ retrieving object and stuffing into a string.
Get s1 from Cache:abcd
Get s2 a from Cache:abcd
Get s2 b from Cache:abcd
Get s2 c from Cache:abcd
com.danga.MemCached.MemCachedClient Mon Dec 30 11:50:06 EST 2013 - ++++ retrieving object and stuffing into a string.
Get s2 c from Cache:abcd
我在这里看:http://www.geelou.com/javadocs/java_memcached-release_2.0.1/com/danga/MemCached/MemCachedClient.html但是我没有看到关于hashCode的任何解释以及它是否对应于memcached服务器中的相同flag / metadata参数。
我认为我的问题大致归结为:com.danga get命令的hashCode参数值是否可以从32更改,这样当我使用元数据/标志1设置s1键时,我可以获得完整的字符串,如上所示指定asString标志或mcca.setPrimitiveAsString(true)?
相关,为什么
System.out.println("Get s2 a from Cache:" +mcca.get("s2"));
打印似乎是abcd的正确值,而不是:
System.out.println("Get s1 from Cache:" +mcca.get("s1"));
System.out.println("Get s1 from Cache:" +mcca.get("s1",1));
打印出似乎正确的abcd值?
正如本回答Memcached getting null for String set with python and then get from Java所述,我可以使用
解决我的问题mcca.setPrimitiveAsString(true);
mcca.setSanitizeKeys(false);
pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);
但我仍然不明白为什么会出现差异,以及是否/如何修改调用以获取参数来修复它
注意: 将flag / metadata参数设置为32的原因是在我运行的另一个小java测试中
System.out.println("set 1 status:" + mcc.set("1", "Modified"));
//which outputs
com.danga.MemCached.MemCachedClient Fri Dec 27 00:12:51 EST 2013 - ++++ memcache cmd (result code): set 1 32 0 8
(STORED)
这似乎表明com.danga库使用的标志/元数据值为32.
我认为我的问题归结为 来自memcache telnet会话
set s1 1 0 4
abcd
set s2 32 0 4
abcd
来自java 为什么
mcca.get("s1")// only gives the first ascii character code (97)
mcca.get("s2")// but gives the entire string. What is so special about the second memcache command using the hash of 32?
答案 0 :(得分:1)
我认为问题在于你的“flag”参数告诉你的库,数据的存储方式不同。我不确定你为什么在telnet SET命令中指定“1”和“32”,但你可能想用指定的其他标志值来测试它。
客户端库经常使用您指定的“1”和“32”来指定数据所在的格式。它们不是哈希值。
答案 1 :(得分:1)
我认为你混合了参数。
的Telnet:
set key metaData expiryTime lengthInBytes
set s1 1 0 4
爪哇:
https://github.com/gwhalin/Memcached-Java-Client
mc.get(key, hash); // <- retrieves key by hash
mc.keyExists(key);
mc.get(key, null, true);