Java开发中的Memcache原理及实现

Memcached 目前三种Java客户端程序

1、官方提供的基于传统阻塞io由Greg Whalin维护的客户端

2、Dustin Sallings实现的基于java nio的Spymemcached

3、XMemcached

工具/原料

Memcache

方法/步骤

1. 三种API比较 1)      memcached client for java

较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。

2)      spymemcached

A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。

3)      xmemcached

XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接 池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。

由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。

XMemcached也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性 能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与Spring框架和Hibernate-memcached的集 成、客户端连接池、可扩展性好等。

1)   memcached client for java

从前面介绍的Java环境的Memcached客户端程序项目网址里,下载最新版的客户端程 序包:java_memcached-release_2.5.1.zip,解压后,文件夹里找到java_memcached- release_2.5.1.jar,这个就是客户端的JAR包。将此JAR包添加到项目的构建路径里,则项目中,就可以使用Memcached了。

示例代码如下:

package temp;

import com.danga.MemCached.*;

import org.apache.log4j.*;

public class CacheTest {

public static void main(String[] args) {

/**

* 初始化SockIOPool,管理memcached的连接池

* */

String[] servers = { "10.11.15.222:10000" };

SockIOPool pool = SockIOPool.getInstance();

pool.setServers(servers);

pool.setFailover(true);

pool.setInitConn(10);

pool.setMinConn(5);

pool.setMaxConn(250);

pool.setMaintSleep(30);

pool.setNagle(false);

pool.setSocketTO(3000);

pool.setAliveCheck(true);

pool.initialize();

/**

* 建立MemcachedClient实例

* */

MemCachedClient memCachedClient = new MemCachedClient();

for (int i = 0; i < 1000; i++) {

/**

* 将对象加入到memcached缓存

* */

boolean success = memCachedClient.set("" + i, "Hello!");

/**

* 从memcached缓存中按key值取对象

* */

String result = (String) memCachedClient.get("" + i);

System.out.println(String.format("set( %d ): %s", i, success));

System.out.println(String.format("get( %d ): %s", i, result));

}

}

}

本文内容整理自网络, 文中所有观点看法不代表淘大白的立场