memcache:http://memcached.org/java
github地址:https://github.com/killme2008/xmemcachedgit
其餘客戶端:github
https://code.google.com/archive/p/spymemcached/spring
http://github.com/gwhalin/Memcached-Java-Clientwindows
我本地安裝了個windows版的memcached客戶端,並添加爲windows服務。
ruby
添加maven包:session
<dependency> <groupId>com.googlecode.xmemcached</groupId> <artifactId>xmemcached</artifactId> <version>2.0.0</version> </dependency>
作個簡單的testcase:maven
package com.raycloud.maijia.schedule.utils; import java.io.IOException; import java.util.concurrent.TimeoutException; import net.rubyeye.xmemcached.MemcachedClient; import net.rubyeye.xmemcached.XMemcachedClient; import net.rubyeye.xmemcached.exception.MemcachedException; import org.junit.Test; public class TestMemcached { @Test public void testIt(){ try { MemcachedClient client = new XMemcachedClient("127.0.0.1", 11556); String testVal = "this is a test demo."; client.set("test_key", 10, testVal); Thread.sleep(5000); System.out.println("=================" + client.get("test_key")); Thread.sleep(15000); System.out.println("=================" + client.get("test_key")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TimeoutException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MemcachedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
輸出結果:memcached
13:51:57.904 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - read 64 bytes from channel =================this is a test demo. 13:52:02.906 [Xmemcached-Reactor-2] DEBUG n.r.xmemcached.impl.MemcachedHandler - Check session (%s) is alive,send heartbeat 13:52:02.907 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - After encodingversion 13:52:02.908 [Xmemcached-Reactor-2] DEBUG n.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:version 13:52:02.908 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - send buffers: [ buffer:position=0,limit=9,capacity=9 ] 13:52:02.910 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - read 16 bytes from channel 13:52:07.911 [Xmemcached-Reactor-2] DEBUG n.r.xmemcached.impl.MemcachedHandler - Check session (%s) is alive,send heartbeat 13:52:07.912 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - After encodingversion 13:52:07.912 [Xmemcached-Reactor-2] DEBUG n.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:version 13:52:07.912 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - send buffers: [ buffer:position=0,limit=9,capacity=9 ] 13:52:07.924 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - read 16 bytes from channel 13:52:12.906 [main] DEBUG c.g.c.y.core.impl.AbstractSession - After encodingget test_key 13:52:12.907 [Xmemcached-Reactor-2] DEBUG n.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:get test_key 13:52:12.908 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - send buffers: [ buffer:position=0,limit=14,capacity=14 ] 13:52:12.909 [Xmemcached-Reactor-2] DEBUG c.g.c.y.core.impl.AbstractSession - read 5 bytes from channel =================null
spring配置:this
<bean name="memcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> <property name="servers"> <value>${memcached.url}</value> </property> <property name="commandFactory"> <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"></bean> </property> </bean>
此處注意對象的比較和變量的比較
其餘:
memcached客戶端集羣,以及使用repcached補丁實現主從複製:
http://sourceforge.net/projects/repcached/
還可使用代理服務:http://code.google.com/p/memagent/
常見問題:
1、net.rubyeye.xmemcached.exception.MemcachedException: Binary protocol doesn't support iterating all keys in memcached
二進制協議不支持遍歷key,文本協議支持(memcache不建議遍歷key,後續版本可能會下線)
KeyIterator it = memcachedClient.getKeyIterator(new InetSocketAddress("127.0.0.1", 11556)); while(it.hasNext()){ String key = it.next(); logger.info("=========key========" + key); }