本文隶属于专题系列: Memcached详解系列

Memcached现在已被广泛使用,使得它的客户端实现也有较多的版本,基本上各个语言的都有。

我是搞Java的,所以这里就主要讲讲Java的客户端。

memcached

Java的客户端目前用的比较广泛比较多的,主要有四个吧,下面分别来讲讲这四个Java客户端。

  • Memcached的官方客户端,Memcached client for Java

优点是比较稳定,早期的版本没有实现一致性hash算法,使用的是传统的BIO性能上相对较差。

目前已经有几个版本的更新,性能有所提高并且也加入了一致性hash。

示例代码:

MemCachedClient client = new MemCachedClient();
//缓存服务地址
String[] addr = { "10.1.10.231:11211", "10.1.10.231:11212" };
//设置权重
Integer[] weights = { 3, 5 };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(addr);
pool.setWeights(weights);
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(200);
pool.setMaxIdle(1000 * 30 * 30);
pool.setMaintSleep(30);
//socket param   timeout ...
pool.setNagle(false);
pool.setSocketTO(30);
pool.setSocketConnectTO(0);
pool.initialize();
//client.set("liyd", "liyd");
System.out.println(client.get("liyd"));
  • Spymemcached

使用了高性能的NIO,并且使用了线程池,性能较高,也实现了一致性hash算法,但是稳定性较差,经常会报出timeout异常。

示例代码:

MemcachedClient memClient = new MemcachedClient(
    AddrUtil.getAddresses(" 10.1.10.231:11211 10.1.10.231:11212"));
//可以添加观察者
//        memClient.addObserver(obs);
Future<Boolean> future = memClient.set("liyd", 0, "liyd-value");
System.out.println("set:" + future.get());
String result = (String) memClient.get("liyd");
System.out.println("get:" + result);
Future<Object> future1 = memClient.asyncGet("liyd");
System.out.println("async get" + future1.get());
memClient.shutdown();
  • xMemcached

看github上的项目主页应该是一个个人的产品,维护的作者就是写metaQ的庄大神。

使用了高性能的NIO,使用了线程池,允许设置节点权重、动态增删节点,性能上比Spymemcached来得更出色,实现了一致性hash算法。稳定性上也比较可靠,可以和spring、hibernate-memcached等框架集成结合使用。

示例代码:

MemcachedClientBuilder builder = new XMemcachedClientBuilder(
	AddrUtil.getAddresses("10.1.10.231:11211 10.1.10.231:11212"));
builder.setFailureMode(true);
builder.setCommandFactory(new BinaryCommandFactory());
builder.setConnectionPoolSize(5);
MemcachedClient client = builder.build();
//动态添加或移除节点
//		client.addServer("localhost:12001 localhost:12002");
//		client.removeServer("localhost:12001 localhost:12002");
boolean b = client.set("liyd", 0, "liyd-value2");
System.out.println("set:" + b);
String value = client.get("liyd");
System.out.println("get:" + value);
GetsResponse<Object> result = client.gets("liyd");
System.out.println("cas:" + result.getCas() + " value:" + result.getValue());
client.shutdown();
  • 淘宝封装的Java客户端

基于官方的memcached client for java封装,使用了NIO,线程池,并且添加了cluster机制支持备份,这是一大特点。

另外还添加了本地缓存结合使用,以优化性能,但实测中发现性能提高有限。

另外把创建客户端改成了配置文件的方式。

示例代码

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<memcached>
    <client name="mclient_0" compressEnable="true" defaultEncoding="UTF-8" socketpool="pool_0">
        <errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler</errorHandler>
    </client>
    <socketpool name="pool_0" maintSleep="5000" socketTO="3000" failover="true" aliveCheck="true" initConn="5"
                minConn="5" maxConn="250" nagle="false">
        <servers>10.1.10.231:11211,10.1.10.231:11212</servers>
        <weights>4,6</weights>
    </socketpool>
</memcached>

Java代码:

ICacheManager<IMemcachedCache> manager = CacheUtil.getCacheManager(IMemcachedCache.class,
    MemcachedCacheManager.class.getName());
manager.setConfigFile("memcached.xml");
manager.start();
IMemcachedCache cache = manager.getCache("mclient_0");
cache.put("liyd", "liyd-test-value");
System.out.println("get:" + cache.get("liyd"));
manager.stop();

以上就是比较流行的几个Java实现的Memcached客户端,当然他们封装的方法还有很多,这里只是列出了最简单的如何连接和获取值,有兴趣的可以查看它们的官网或者自行进行百度。

memcached也可以存储复杂的JavaBean对象,但是要注意存储的对象必须实现了序列化,即实现Serializable接口,客户端在存取时会有序列化和反序列化操作。

在这几个客户端中,我个人比较偏向于使用xmemcached,该有的功能都有,性能上也十分出色,当然如果你需要cluster机制那淘宝的封装版无疑是你最好的选择。

xmemcached还支持十分方便的与其它框架进行集成,例如与spring集成:

<bean name="memcachedClient"
	class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
			<property name="servers">
					  <value>localhost:12000 localhost:12001</value>
			</property>
</bean>

当然也支持设置权重:

MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000 localhost:12001"),new int[]{1,3});
builder.setSessionLocator(new KetamaMemcachedSessionLocator());
MemcachedClient memcachedClient=builder.build();
//动态添加时设置权重
//memcachedClient.addServer("localhost",12000,2);
这些在它的官方主页上都有,可以自己去看看: https://github.com/killme2008/xmemcached

Memcached的介绍就到这里了,当然你还可以根据自身需要对它进行各类优化。

前段时间我们就根据项目的实际情况对xmemcached客户端添加了本地缓存功能,这个有机会再聊了。

你可能感兴趣的内容
0条评论

selfly

交流QQ群:32261424
Owner