前面我们讲解了memcache的概念及安装,本节我们使用java客户端连接测试,看一下其如何在开发过程中使用。
Memcached Client目前有3种:
1.Memcached Client for Java
项目地址:https://github.com/gwhalin/Memcached-Java-Client/
2.SpyMemcached
项目地址:http://code.google.com/p/spymemcached/
3.XMemcached
项目地址:https://github.com/killme2008/xmemcached
这三种Client一直存在各种争议:
Memcached Client for Java比SpyMemcached更稳定、更早、更广泛;
SpyMemcached 比 Memcached Client for Java更高效;
XMemcached 比 SpyMemcache并发效果更好。
用数据来说话,参考官方性能对比:
Memcached Client for Java: https://github.com/gwhalin/Memcached-Java-Client/wiki/PERFORMANCE
XMemcached: https://github.com/killme2008/xmemcached/blob/master/benchmark/benchmark.html
下面我们以Memcached Client for Java为例演示一下其使用。
1.在maven仓库中添加java-memcached-2.6.2.jar
由于目前java memcached client没有官方的maven repository可供使用,因此使用时需要手动将其安装到本地repository。java memcached client的jar包下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads 目前2.6.2版本的java memcached client要依赖slf4j-simple、slf4j-api、commons-pool三个包,依此我们可以为其编辑一个pom文件,将java memcached client的jar包和pom文件一起安装,解决java memcached client对其他jar包的依赖。安装命令:
mvn install:install-file -Dfile=/path/to/java-memcached-release_2.6.2.jar -DpomFile=/path/to/java-memcached-2.6.2.pom
其中java-memcached-2.6.2.pom的内容为:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
com.danga
java-memcached
2.6.2
org.slf4j
slf4j-simple
1.6.2
org.slf4j
slf4j-api
1.6.2
commons-pool
commons-pool
1.5.6
log4j
log4j
1.2.12
2.添加jar到工程的pom.xml
com.danga
java-memcached
2.6.2
3.实例代码
实体:User.java
package cn.slimsmart.memcache.demo.test;
import java.io.Serializable;
//实体需要序列化
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}客户端工具类:MemCachedManager.java
package cn.slimsmart.memcache.demo.test;
import java.util.Date;
import com.meetup.memcached.MemcachedClient;
import com.meetup.memcached.SockIOPool;
/**
* 客户端工具类
*/
public class MemCachedManager {
// 创建全局的唯一实例
private static MemcachedClient memcachedClient;
private static MemCachedManager memCachedManager = new MemCachedManager();
static {
// 设置缓存服务器列表,当使用分布式缓存的时,可以指定多个缓存服务器。这里应该设置为多个不同的服务
String[] servers = { "192.168.100.110:11211", "192.168.100.110:11311", "192.168.100.110:11411" };
// 设置服务器权重
Integer[] weights = { 3, 2, 1 };
// 创建一个Socked连接池实例
SockIOPool sockIOPool = SockIOPool.getInstance();
sockIOPool.setServers(servers);// 设置memcached服务器地址
sockIOPool.setWeights(weights);// 设置每个MemCached服务器权重
sockIOPool.setFailover(true); // 当一个memcached服务器失效的时候是否去连接另一个memcached服务器.
sockIOPool.setInitConn(10); // 初始化时对每个服务器建立的连接数目
sockIOPool.setMinConn(10); // 每个服务器建立最小的连接数
sockIOPool.setMaxConn(100); // 每个服务器建立最大的连接数
sockIOPool.setMaintSleep(30);// 自查线程周期进行工作,其每次休眠时间
sockIOPool.setNagle(false); // Socket的参数,如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。
sockIOPool.setSocketTO(3000);// Socket阻塞读取数据的超时时间
sockIOPool.setAliveCheck(true);// 设置是否检查memcached服务器是否失效
sockIOPool.setMaxIdle(1000 * 30 * 30);// 设置最大处理时间
sockIOPool.setSocketConnectTO(0);// 连接建立时对超时的控制
sockIOPool.setMaintSleep(30);// 设置主线程睡眠时间,每30秒苏醒一次,维持连接池大小
sockIOPool.initialize();// 初始化连接池
if (memcachedClient == null) {
memcachedClient = new MemcachedClient();
}
// 压缩设置,超过指定大小(单位为K)的数据都会被压缩
memcachedClient.setCompressEnable(true);
memcachedClient.setCompressThreshold(64 * 1024);
}
/**
* 获取唯一实例.
*
* @return
*/
public static MemCachedManager getInstance() {
return memCachedManager;
}
private MemCachedManager() {
}
/**
* 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new
* Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。
* 设置过期时间:设置10分钟后过期,是应该设置date为System.currentTimeInMillis()+10*60*1000
* 还是10*60*1000 服务端是两种方式都兼容的,一个是多少秒后过期,一个是什么时候过期, 但后者因为设置时间是在客户端,
* 存储在服务端,假如两台服务器时间差别很大,就会导致数据的过期时间和我要求的时间点不符合。
*
*/
public static boolean add(String key, Object value, Date expire) {
return memcachedClient.add(key, value, expire);
}
/**
* 根据键获取Memcached内存缓存管理系统中相应的值
*/
public static Object get(String key) {
return memcachedClient.get(key);
}
public boolean replace(String key, Object value) {
return memcachedClient.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry) {
return memcachedClient.replace(key, value, expiry);
}
}测试类:
package cn.slimsmart.memcache.demo.test;
import java.util.Date;
//测试
public class Test {
public static void main(String[] args) {
User user = new User();
user.setUserName("lucy");
user.setPassword("abc123");
MemCachedManager.add("user", user, new Date(1000 * 60));// 向Memcached中添加一个序列化的对象
user = (User) (MemCachedManager.get("user"));
System.err.println("用户名:" + user.getUserName() + ",密码:" + user.getPassword());
}
}运行打印:
用户名:lucy,密码:abc123
关于SpyMemcached的使用添加相应jar
net.spy
spymemcached
2.11.6
具体请参考代码示例: