框架基础____缓存框架基本的原理_一个简单的缓存工具类CacheUtil
2017-09-06 10:18
260 查看
package com.lp.frame.base.utils.cache; import java.io.Serializable; import java.util.Iterator; import java.util.Map.Entry; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; /** * @author Administrator * 缓存工具类 */ public class CacheUtil implements Serializable { /** * SERID */ private static final long serialVersionUID = -5393496161251379029L; /** * 缓存集合 */ private static ConcurrentHashMap<String, CacheValue> mapCache = new ConcurrentHashMap<String, CacheValue>(); private static Timer timer; private static byte[] lock = new byte[0]; private static boolean isRun = false; //没隔多少秒清理一次 6秒 private static Long DEFAULT_TASK_PERIOD = 1000L * 6 ; //该key的值超时时间为 30秒 private static Long DEFAULT_TIMEOUT = 1000L * 30 ; private static CacheUtil instance; private CacheUtil() { } public static CacheUtil getInstance() { synchronized (lock) { if (instance == null) { instance = new CacheUtil(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { clearCache(); } }, 0, DEFAULT_TASK_PERIOD); } } return instance; } public Object put(String key, Object value,long timeout) { CacheValue cvalue = new CacheValue(); if(key != null){ cvalue.setKey(key); } cvalue.setValue(value); if(timeout != 0){ cvalue.setTimeout(timeout); }else{ cvalue.setTimeout(DEFAULT_TIMEOUT); } cvalue.setCreateTime(System.currentTimeMillis()); return mapCache.put(key, cvalue); } public Object get(String key) { if (key != null) { Object obj = null; if (mapCache.containsKey(key)) { obj = mapCache.get(key); } if (obj != null) { CacheValue cvalue = (CacheValue) obj; return cvalue.getValue(); } } return null; } public boolean containsKey(String key) { return mapCache.containsKey(key); } private static void clearCache() { if (!isRun) { synchronized (lock) { try { isRun = true; if (!mapCache.isEmpty()) { System.out.println("移除前:"+mapCache); Iterator<Entry<String, CacheValue>> iterator = mapCache.entrySet().iterator(); while (iterator.hasNext()) { Entry<String, CacheValue> entry = iterator.next(); CacheValue cacheValue = entry.getValue(); if (cacheValue.isTimeout()) { mapCache.remove(entry.getKey()); System.out.println("移除超时__:"+entry.getKey()); } } System.out.println("剩余__:"+mapCache); } } catch (Exception e) { e.printStackTrace(); }finally{ isRun = false; } } } } class CacheValue implements Serializable { private static final long serialVersionUID = 800800964682488492L; private String key; private Object value; private Long createTime; private Long timeout; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Long getCreateTime() { return createTime; } public void setCreateTime(Long createTime) { this.createTime = createTime; } public Long getTimeout() { return timeout; } public void setTimeout(Long timeout) { this.timeout = timeout; } public Object getValue() { isTimeout(); return value; } public void setValue(Object value) { this.value = value; } public boolean isTimeout() { boolean flag = true; if (value != null) { flag = System.currentTimeMillis() - createTime >= timeout; if (flag) { value = null; } } return flag; } } }
//测试类
package com.lp.frame.base.utils.cache.test;
import com.lp.frame.base.utils.cache.CacheUtil;
public class Test {
public static void main(String[] args) {
//1.初始化缓存对象
CacheUtil cacheUtil=CacheUtil.getInstance();
cacheUtil.put("user", "zhangsan", 1000L * 30);//30秒失效
cacheUtil.put("pwd", "zhangsan",1000L * 70);//70秒失效
System.out.println(cacheUtil.get("user"));
System.out.println(cacheUtil.get("pwd"));
System.out.println(cacheUtil.containsKey("user"));
System.out.println(cacheUtil.containsKey("pwd"));
try {
Thread.sleep(60000L); //1分钟休眠
} catch (InterruptedException e) {
e.printStackTrace();
}
//想得到的结果 user已经失效 但是pwd还可以获取到
System.out.println("1分钟后"+cacheUtil.get("user"));
System.out.println("1分钟后"+cacheUtil.get("pwd"));
}
}
//运行结构
相关文章推荐
- (1)一步一步开发一个简单二维CAD之基本框架
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- duilib学习笔记01:一个简单的Duilib程序的基本框架
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- 一个简单的、面向对象的javascript基础框架
- 一个简单的Servlet框架(帮助理解Servlet原理)
- 理解vue实现原理,实现一个简单的Vue框架
- go实现一个简单的游戏服务器框架(lotou)基本设计
- Java基础之--缓存基本实现原理
- ASimpleCache一个简单的缓存框架
- CodeIgniter框架——创建一个简单的Web站点(include MySQL基本操作)
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- EF实体框架简单原理及基本增删改查用法(上)
- Dubbo入门-分布式原理详解--搭建一个最简单的Demo框架
- redis结合ssm框架中的使用,以AOP原理做一个redis缓存管理
- CodeIgniter框架的缓存原理分解
- Emit学习-实战篇-实现一个简单的AOP框架(二)
- 继文章‘’ 自己动手写一个轻量级的Android网络请求框架‘’后续------增加缓存功能
- 【编译原理龙书笔记】(二)一个简单的语法制导翻译器(仍未完成)
- Java基础---Java---IO流-----LineNumberReader方法及原理、自定义一个LineNumberReader、字节流、图片复制、mp3复制、