HashMap实现简单的缓存Cache
2016-01-27 11:34
302 查看
真实项目中,如果并发访问量多,必然对项目的性能有所要求,也自然而然的用到缓存机制,当下针对Java已经有成熟的和优秀的缓存框架Ehcache、Jboss cache等等。今天呢,我就想用咱们jdk自带的HashMap来实现简单的缓存。
项目需求:
用户查到数据,查询条件相同时,第一次走数据库,第二次以后在一段时间内走缓存,提高响应的速度
涉及的知识:
线程池
线程的知识
Map的简单知识
下面来看Java代码的实现和测试:
线程池知识:
常见的两个线程池:CachedThredoppl、FixedThreadPool。CachedThredoppl在程序执行过程中通常会创建与所需要数量相同的线程,然后在它回收旧线程时停止创建线程,因此它是合理的Executor的首选。只有这种方式会引发问题,你才需要切换到FixedThreadPool
项目需求:
用户查到数据,查询条件相同时,第一次走数据库,第二次以后在一段时间内走缓存,提高响应的速度
涉及的知识:
线程池
线程的知识
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
相关文章推荐
- 布局优化的几种方法
- MySql自动插入当前时间
- Codeforces Round #340 (Div. 2)
- php7编译安装
- 新浪微盘2
- is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
- poj 3268 Silver Cow Party(最短路径)
- Android基础之Animation——补间动画学习
- iOS开发-UI控件:UIImagePickerController 视频录制操作,视频大小,时间长度
- linux中查找文件并合并文件
- 源码来袭!!!基于jquery的ajax分页插件(demo+源码)
- setBackground报错 不兼容4.1以下版本
- linux终端快捷键
- 编程日常160127
- Hive-3.hive 的 hql 语句
- 享元模式
- [LeetCode] Count of Range Sum 区间和计数
- SQL Server 中截取字符串常用的函数
- CentOS 6.5安装MySQL中文乱码问题解决
- C++【String类】String删除单个字符,删除字符串的函数实现