您的位置:首页 > 其它

HashMap实现简单的缓存Cache

2016-01-27 11:34 302 查看
真实项目中,如果并发访问量多,必然对项目的性能有所要求,也自然而然的用到缓存机制,当下针对Java已经有成熟的和优秀的缓存框架Ehcache、Jboss cache等等。今天呢,我就想用咱们jdk自带的HashMap来实现简单的缓存。

项目需求:

      用户查到数据,查询条件相同时,第一次走数据库,第二次以后在一段时间内走缓存,提高响应的速度

涉及的知识:

    线程池

    线程的知识

    Map的简单知识

下面来看Java代码的实现和测试:

import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* @author 刘伊凡
*
*/
public class Cache {

/** 线程池对象 **/
private static ExecutorService exec = Executors.newCachedThreadPool();

/** 保存查询结果集的Map **/
private static final HashMap<Integer,Object> cacheMap = new HashMap<Integer,Object>() ;
/** 当前结果集的标识ID **/
private static int id = 1 ;

/**
* 设置要缓存的对象
* @param <T>
* @param Object 缓存对象
* @return 标识ID
*/
public static synchronized <T> int setCacheObject(T Object){
return setCacheObject(Object,1000);
}

/**
* 设置要缓存的对象
* @param <T>
* @param object 缓存对象
* @param timeToLive 对象生存期(以毫秒数为单位)
* @return 标识ID
*/
public static synchronized <T> int setCacheObject(T object, final long timeToLive){

if(Integer.MAX_VALUE <= id){
id = 1;
}

cacheMap.put(id, object);
id++;

exec.execute(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(timeToLive);
} catch (InterruptedException e) {
e.printStackTrace();
}
cacheMap.remove(id - 1);
}
});

return id - 1;
}

/**
* 获取特定缓存对象
* @param <T>
* @param i 标识ID
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getCacheObject(int i, Class<T> clazz){
return (T)cacheMap.get(i);
}

/***
* Cache测试
* @param args
*/
public static void main(String[] args) {
long timeToLive = 3000l;
Cache.setCacheObject("刘伊凡", timeToLive);
long beginTime = System.currentTimeMillis();
while(!cacheMap.isEmpty()){
for(Integer id : cacheMap.keySet()){
System.out.println(cacheMap.get(id));
}
}
long endTime = System.currentTimeMillis();
System.out.println("设置存活时间:"+timeToLive+",实际存活时间:"+(endTime-beginTime));
System.exit(0);
}
}

线程池知识:

     常见的两个线程池:CachedThredoppl、FixedThreadPool。CachedThredoppl在程序执行过程中通常会创建与所需要数量相同的线程,然后在它回收旧线程时停止创建线程,因此它是合理的Executor的首选。只有这种方式会引发问题,你才需要切换到FixedThreadPool
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: