因为在实际应用的中的的业务逻辑和实体缓存数据比较复杂,在这里通过一个简单的实例来进行说明。
1、下载工具包文件,地址:https://github.com/gwhalin/Memcached-Java-Client/downloads
下载后解压:里面存在四个jar文件,分别为:commons-pool-1.5.6.jar、slf4j-api-1.6.1.jar、slf4j-simple-1.6.1.jar、java_memcached-release_2.6.6.jar。
2、将四个工具包加载并完成工具类的编写,代码如下:
package xft.workbench.servers.memcached;
import java.util.Date;
import org.apache.log4j.Logger;
import xft.workbench.servers.spring.SysPropertyConfigure;
import xft.workbench.servers.util.EmptyUtil;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
*
*
功能描述:Memcached的工具类 * * @author :*/ public final class MemcachedUtil { private static Logger logger = Logger.getLogger(MemcachedUtil.class); /** * 构造函数:工具类,禁止实例化 * */ private MemcachedUtil() { } // 创建全局的唯一实例 private static MemCachedClient mcc = new MemCachedClient(); /** * 自身实例 */ private static MemcachedUtil memcachedUtil = new MemcachedUtil(); // 设置与缓存服务器的连接池 static { try{ String serversStr="127.0.0.1:11211,192.168.1.22:11211"; String weightsStr="3,7"; if(EmptyUtil.isEmpty(serversStr) || EmptyUtil.isEmpty(weightsStr)){ throw new Exception("系统异常!请设置memcached的服务器列表和其权重信息!"); } // 服务器列表和其权重 String[] servers = serversStr.split(",");// Ip地址和端口号 // 权重 String[] weightsStrs=weightsStr.split(","); Integer[] weights = new Integer[weightsStrs.length]; for(int i =0;i功能描述:获取唯一实例. * * @return * * * */ public static MemcachedUtil getInstance(){ logger.info("MemcachedUtil成功获得"); return memcachedUtil; } /** * *
* * 修改历史:(修改人,修改时间,修改原因/内容) * *
功能描述:新增一个缓存数据 * * * @param key 缓存的key * @param value 缓存的值 * @return 操作结果 * * **/ public boolean add(String key, Object value) throws Exception{ logger.info("新增一个缓存数据,key="+key+",value="+value.toString()); // 不会存入缓存 return mcc.add(key, value); // return mcc.set(key, value); } /** * *
功能描述:新增一个缓存数据 * * * @param key 缓存的key * @param value 缓存的值 * @param expiry 缓存过期的时间 * @return 操作结果 * **/ public boolean add(String key, Object value, Date expiry) throws Exception{ logger.info("新增一个缓存数据,key="+key+",value="+value.toString()+",expiry="+expiry.getTime()); // 不会存入缓存 return mcc.add(key, value, expiry); // return mcc.set(key, value, expiry); } /** *
功能描述:替换已有的缓存数据 * * * @param key 设置对象的key * @return Object 设置对象的值 * @return 是否替换成功 * * **/ public boolean replace(String key, Object value) throws Exception{ logger.info("替换已有的缓存数据,key="+key+",value="+value.toString()); return mcc.replace(key, value); } /** * *
功能描述:替换已有的缓存数据 * * @param key 设置对象的key * @return Object 设置对象的值 * @param expiry 过期时间 * @return 是否替换成功 * * **/ public boolean replace(String key, Object value, Date expiry) throws Exception{ logger.info("替换已有的缓存数据,key="+key+",value="+value.toString()+",expiry="+expiry.getTime()); return mcc.replace(key, value, expiry); } /** * *
功能描述:根据指定的关键字获取对象 * * * @param key 获取对象的key * @return Object 对象值 * * **/ public Object get(String key) { Object obj=null; try{ obj=mcc.get(key); logger.info("根据指定的关键字获取对象,key="+key+",value="+obj.toString()); }catch(Exception e){} return obj; } /** * *
功能描述:根据指定的关键字删除对象 * * @param key 获取对象的key * @return 是否成功删除 * * **/ public boolean delete(String key) throws Exception{ logger.info("根据指定的关键字删除对象,key="+key); return mcc.delete(key); } }
3、测试,代码如下 :
public static void main(String[] args) {
MemcachedUtil cache = MemcachedUtil.getInstance();
cache.add("key1", "key1_test");
cache.add("key2", "key2_test",new Date(10*1000));//只保留10秒
System.out.println(cache.get("key1"));
System.out.println(cache.get("key2"));
try {
Thread.sleep(11*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("11秒过后的缓存中key对应值的情况");
System.out.println(cache.get("key1"));
System.out.println(cache.get("key2"));
}
运行结果:
最后显示null表示前面设置的key2只在内存中缓存10秒起了作用所以第二次没有查询到对应该数据。