Memcache服务端已经安装好,此时我们可以在程序中进行缓存操作了,这时我们需要Memcache客户端进行操作。市场上Memcache客户端有很多种,这里我们对两种使用比较广泛的客户端进行介绍。
我们常使用客户的方法为以下几种:
public interface IMemCacheClient {
public Object get(String key);//从缓存获取一个指定的值,获取的值需要进行强制转换
public boolean set(String key,Object value);//添加一个指定的值到缓存,如果key存在则替换它
public boolean set(String key,Object value,int expiry);//添加一个指定的值到缓存,并且指定value的生命周期,如果key存在则替换它
public boolean add(String key,Object value);//添加一个指定的值到缓存,如果key存在返回false
public boolean add(String key,Object value,int expiry);//添加一个指定的值到缓存,并且指定value的生命周期,如果key存在返回false
public boolean replace(String key,Object value);//替换一个值到缓存,失败false
public boolean replace(String key,Object value,int expiry);//替换一个值到缓存,失败false,并指定生命周期
public boolean del(String key);//删除指定的值
public boolean flushAll();//删除指定的值,置为失效
}
主要的区别是客户端初始化方法,这两种客户端初始化方法代码如下:
1、Memcached-Java-Client
// 创建全局的唯一实例
private MemcachedClient client = new MemcachedClient();
// 设置与缓存服务器的连接池
static{
// 服务器列表和其权重
String[] servers = { "192.168.56.102:11211" };
// 获取soket 连接池的实例对象
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器信息
pool.setServers(servers);
pool.setFailover(true);
//设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
// 设置主线程的睡眠时间
pool.setMaintSleep(30);
// 设置TCP的参数和连接超时
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
// 初始化连接池
pool.initialize();
}
2、XmemcacheClient
private static XmemcacheClient instance = new XmemcacheClient();
/** XMemCache允许开发者通过设置节点权重来调节MemCache的负载,设置的权重越高,该MemCache节点存储的数据越多,负载越大 */
private static MemcachedClientBuilder mcb =
new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.56.102:11211"), new int[]{1});
private static MemcachedClient mc = null;
/** 初始化加载客户端MemCache信息 */
static
{
mcb.setCommandFactory(new BinaryCommandFactory()); // 使用二进制文件
mcb.setConnectionPoolSize(10); // 连接池个数,即客户端个数
try
{
mc = mcb.build();
}
catch (IOException e)
{
e.printStackTrace();
}
}
3、完整示例(Memcached-Java-Client)
MemcacheClient1.java
/**
*
*/
package com.css.sword.cache;
import java.util.Calendar;
import java.util.Date;
import com.meetup.memcached.MemcachedClient;
import com.meetup.memcached.SockIOPool;
/**
* <p>Title:MemcacheClient1</p>
* <p>Description: 使用memcache_client.jar(Memcached-Java-Client-master) com.meetup.memcached</p>
* @author yuanxj
* @date 2017-2-27
*/
public class MemcacheClient1 implements IMemCacheClient{
// 创建全局的唯一实例
private MemcachedClient client = new MemcachedClient();
private static MemcacheClient1 client1 = new MemcacheClient1();
// 设置与缓存服务器的连接池
static{
// 服务器列表和其权重
String[] servers = { "192.168.56.102:11211" };
// 获取soket 连接池的实例对象
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器信息
pool.setServers(servers);
pool.setFailover(true);
//设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
// 设置主线程的睡眠时间
pool.setMaintSleep(30);
// 设置TCP的参数和连接超时
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
// 初始化连接池
pool.initialize();
}
private MemcacheClient1 (){}
public static MemcacheClient1 getInstance() {
return client1;
}
@Override
public Object get(String key) {
// TODO Auto-generated method stub
return client.get(key);
}
@Override
public boolean set(String key, Object value) {
// TODO Auto-generated method stub
//client.setSanitizeKeys(false);
return client.set(key, value);
}
@Override
public boolean set(String key, Object value, int expiry) {
// TODO Auto-generated method stub
Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.SECOND, expiry);
return client.set(key, value,nowTime.getTime());
}
@Override
public boolean add(String key, Object value) {
// TODO Auto-generated method stub
return client.add(key, value);
}
@Override
public boolean add(String key, Object value, int expiry) {
// TODO Auto-generated method stub
Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.SECOND, expiry);
return client.add(key, value,expiry);
}
@Override
public boolean replace(String key, Object value) {
// TODO Auto-generated method stub
return client.replace(key, value);
}
@Override
public boolean replace(String key, Object value, int expiry) {
// TODO Auto-generated method stub
Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.SECOND, expiry);
return client.replace(key, value,expiry);
}
@Override
public boolean del(String key) {
// TODO Auto-generated method stub
return client.delete(key);
}
@Override
public boolean flushAll() {
// TODO Auto-generated method stub
return client.flushAll();
}
}
测试:
public static void main(String[] args){
try {
MemcacheClient1 client1 = new MemcacheClient1();
client1.set("name", "liuhuao");
String myObject = (String) client1.get("name");
System.out.println(myObject);
} catch (Exception e) {
e.printStackTrace();
}
}
这只是个简单的示例,XmemcacheClient和这个类似,需要注意的有两点:
(1)Memcached-Java-Client客户端的生命周期 expiry是Date类型,而XmemcacheClient是int类型,所以需要转换下;
(2)关于key值,例如key值为+iBGV1cMhD+sQmK1rxUMtQ==
Memcached-Java-Client 会将key值设为%2BiBGV1cMhD%2BsQmK1rxUMtQ%3D%3D
而XmemcacheClient是原值,查看Memcached-Java-Client源码发现该客户端会对key进行编码URLEncoder.encode,如果不行进行编码,可用client.setSanitizeKeys(false)解决。