java 缓存有时必不可少
常见缓存框架:EhCache,oschcache
1.需要配置一个xml文件,官网上有
<?xml version="1.0" encoding="UTF-8"?> <ehcache name="EventCache"> <defaultCache maxElementsInMemory="10" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"> </defaultCache> </ehcache>
2.cache工具类,封装
package org.wangcong.cache;
import java.util.HashMap;
import java.util.Map;
import org.wangcong.cache.interfaces.InitCacheInter;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
public class CacheUtil {
private static Map<String,String> CACHE_CLASS = new HashMap<String,String>();//缓存和实现类对应表,应该从数据库中读取,这里模拟
private static CacheManager manager = null;//缓存总管
static{
manager = CacheManager.create();
CACHE_CLASS.put("CACHE_CODE1", "org.wangcong.cache.impl.InitCacheInterImpl1");
}
public static Cache getCache(String cacheName)throws Exception{//获取具体缓存
Cache cache = manager.getCache(cacheName);
if(cache==null){
cache = new Cache(cacheName, 5000, false, false, 5, 2);
manager.addCache(cache);
initCache(cache,cacheName);
}
return cache;
}
private static void initCache(Cache cache,String cacheName) throws Exception{//加载缓存资源
//因为cacheName-->缓存具体实现类
String className = CACHE_CLASS.get(cacheName);
InitCacheInter initCache = (InitCacheInter) Class.forName(className).newInstance();
initCache.initCache(cache);
}
public static Object getValue(Cache cache,String key){
return cache.get(key).getObjectValue();
}
}
3.定义接口契约
package org.wangcong.cache.interfaces;
import net.sf.ehcache.Cache;
public interface InitCacheInter {
public void initCache(Cache cache)throws Exception;
}
4.定义一个实现类
package org.wangcong.cache.impl;
import org.wangcong.cache.interfaces.InitCacheInter;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
public class InitCacheInterImpl1 implements InitCacheInter {
public InitCacheInterImpl1(){
}
public void initCache(Cache cache) throws Exception {
//模拟加载数据
Element ele1 = new Element("key1", "value1");
Element ele2 = new Element("key2", "value2");
//...Element("key",Object obj);
cache.put(ele1);
cache.put(ele2);
}
}
5.定义一些KEY
package org.wangcong.cache;
public class CacheStatic {
final public static String CACHE_CODE1 = "CACHE_CODE1";//org.wangcong.cache.impl.InitCacheInterImpl1
}
6.定义一个业务实现类
package org.wangcong.cache.test.service;
import net.sf.ehcache.Cache;
import org.wangcong.cache.CacheStatic;
import org.wangcong.cache.CacheUtil;
public class CacheCode1 {
public Object getValue(String key)throws Exception{
Cache cache = CacheUtil.getCache(CacheStatic.CACHE_CODE1);
Object obj = CacheUtil.getValue(cache, key);
return obj;
}
}
7.主函数,进行测试
package org.wangcong.cache.test;
import org.wangcong.cache.test.service.CacheCode1;
public class CacheDeno {
/**
* @param args
*/
public static void main(String[] args) {
CacheCode1 code1 = new CacheCode1();
try {
System.out.println(code1.getValue("key1"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
-----
这样把业务层和实现层全部分离出来,可扩展性比较好些--OVER