我是新来的memcached和结识一个老朋友,爪哇 – 我用Java 1.7运行在赢得x64。 同时通过设置文件couchbase-server-enterprise_2.2.0_x86_64在本地win 64机器上运行couchbase memcache服务器。 一切工作正常,直到我注意到一个奇怪的行为时,在与telnet会话中的密钥集进行string比较,并在Java中检查此密钥。
从telnet会话
set s1 1 0 4 abcd STORED set s2 32 0 4 abcd STORED
从我的主要Javatesting类:…
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服务器中的标志/元数据参数。
我认为我的问题大致归结为:com.danga get命令的hashCode参数值可以从32更改,这样我可以得到完整的string,当我设置的元数据/标志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获得空string设置与python,然后从Java获得我可以解决我的问题使用
mcca.setPrimitiveAsString(true); mcca.setSanitizeKeys(false); pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);
但我仍然不明白为什么会出现差异,如果/如何修改调用来获取参数来修复它
注:设置标志/元数据参数为32的原因是在另一个小的Javatesting我跑
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远程login会话
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?
我认为问题是你的“标志”参数告诉你的数据库存储的数据是不同的。 我不知道你为什么要在telnet SET命令中指定“1”和“32”,但是你可能想用一个不同的标志值来测试它。
您指定的“1”和“32”通常由客户端库用于指定数据所在的格式。它们不是哈希值。
我认为你混合的参数。
远程登录:
set key metaData expiryTime lengthInBytes set s1 1 0 4
Java的:
https://github.com/gwhalin/Memcached-Java-Client
mc.get(key, hash); // <- retrieves key by hash mc.keyExists(key); mc.get(key, null, true);