Java 本地缓存的实现_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java 本地缓存的实现

Java 本地缓存的实现

 2015/1/24 3:33:03  zhangwei_david  程序员俱乐部  我要评论(0)
  • 摘要:一个简易的本地缓存实现首先定义一个缓存实体,包含三个属性放入缓存的时间戳,值以及过期时间/****@authorzhangwei_david*@version$Id:CacheEntity.java,v0.12014年9月6日下午2:07:00LenovoExp$*//***本地缓存保存的实体**@authorLenovo*@version$Id:LocalCache.java,v0.12014年9月6日下午1:13
  • 标签:实现 Java 缓存

?一个简易的本地缓存实现

?首先定义一个缓存实体,包含三个属性?放入缓存的时间戳,值以及过期时间

?

class="java">/**
*
* @author zhangwei_david
* @version $Id: CacheEntity.java, v 0.1 2014年9月6日 下午2:07:00 Lenovo Exp $
*/
/**
*本地缓存保存的实体
*
* @author Lenovo
* @version $Id: LocalCache.java, v 0.1 2014年9月6日 下午1:13:43 Lenovo Exp $
*/
public class CacheEntity implements Serializable {

/** */
private static final long serialVersionUID = 7172649826282703560L;

/**
* 值
*/
private Object value;

/**
* 保存的时间戳
*/
private long gmtModify;

/**
* 过期时间
*/
private int expire;

public Object getValue() {
return value;
}

public void setValue(Object value) {
this.value = value;
}

public long getGmtModify() {
return gmtModify;
}

public void setGmtModify(long gmtModify) {
this.gmtModify = gmtModify;
}

public int getExpire() {
return expire;
}

public void setExpire(int expire) {
this.expire = expire;
}

public CacheEntity(Object value, long gmtModify, int expire) {
super();
this.value = value;
this.gmtModify = gmtModify;
this.expire = expire;
}

}

?

/**
* 简易本地缓存的实现类
* @author zhangwei_david
* @version $Id: LocalCache.java, v 0.1 2014年9月6日 下午1:04:53 zhangwei_david Exp $
*/
public class LocalCache {

private static int DEFAULT_CAPACITY = 512;

private static int MAX_CAPACITY = 100000;

private static int MONITOR_DURATION = 2;

static {
new Thread(new TimeoutTimerThread()).start();
}

private static ConcurrentHashMap<String, CacheEntity> cache = new ConcurrentHashMap<String, CacheEntity>(
DEFAULT_CAPACITY);

/**
* 将key-value 保存到本地缓存并制定该缓存的过期时间
*
* @param key
* @param value
* @param expireTime 过期时间,如果是-1 则表示永不过期
* @return
*/
public boolean putValue(String key, Object value, int expireTime) {
return putCloneValue(key, value, expireTime);
}

/**
* 将值通过序列化clone 处理后保存到缓存中,可以解决值引用的问题
*
* @param key
* @param value
* @param expireTime
* @return
*/
private boolean putCloneValue(String key, Object value, int expireTime) {
try {
if (cache.size() >= MAX_CAPACITY) {
return false;
}
// 序列化赋值
CacheEntity entityClone = clone(new CacheEntity(value, System.nanoTime(), expireTime));
cache.put(key, entityClone);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}

/**
*
* 序列化 克隆处理
* @param object
* @return
*/
private <T extends Serializable> T clone(T object) {
T cloneObject = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
cloneObject = (T) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return cloneObject;
}

/**
*从本地缓存中获取key对应的值,如果该值不存则则返回null
*
* @param key
* @return
*/
public Object getValue(String key) {
return cache.get(key).getValue();

}

/**
* 清空所有
*/
public void clear() {
cache.clear();
}

/**
* 过期处理线程
*
* @author Lenovo
* @version $Id: LocalCache.java, v 0.1 2014年9月6日 下午1:34:23 Lenovo Exp $
*/
static class TimeoutTimerThread implements Runnable {
public void run() {
while (true) {
try {
System.out.println("Cache monitor");
TimeUnit.SECONDS.sleep(MONITOR_DURATION);
checkTime();
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 过期缓存的具体处理方法
* @throws Exception
*/
private void checkTime() throws Exception {
//"开始处理过期 ";

for (String key : cache.keySet()) {
CacheEntity tce = cache.get(key);
long timoutTime = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime()
- tce.getGmtModify());
//" 过期时间 : "+timoutTime);
if (tce.getExpire() > timoutTime) {
continue;
}
System.out.println(" 清除过期缓存 : " + key);
//清除过期缓存和删除对应的缓存队列
cache.remove(key);
}
}
}

}
发表评论
用户名: 匿名