黑马程序员技术交流社区
标题:
java中的缓存机制问题
[打印本页]
作者:
张胜格
时间:
2012-12-30 16:26
标题:
java中的缓存机制问题
有新数据到来时,怎样将缓存中最久未使用的数据从缓存中清除掉?最好能给出原理和程序
作者:
王少雷
时间:
2012-12-30 16:36
这问题更犀利。。。占个沙发,坐等高手 解释。。。
作者:
冉世友
时间:
2012-12-30 21:54
我只知道有垃圾回收机制。。。。
作者:
王玮
时间:
2012-12-30 22:38
依稀记得,这玩意 是操作系统有提到,什么先进先出,最近最久未被使用,。。。。这些东西 ,感觉应该也会被用到这。。。具体的真不晓得,目前也不想晓得。
作者:
谢毅
时间:
2012-12-30 23:31
说一下缓存的管理不是靠时间久来计算的,是靠最大不活动间隔计算的。先打个比方说明下缓存是什么,有一个空间复制了硬盘上的一些数据,这个空间假如在内存上,那么程序需要这些数据的时候,从这个空间比从硬盘快得多,这就是缓存机制。要弄懂缓存先要明确几点:
1、缓存区必须是公有的,对外一致的,所以它是单例
2、不同的程序调用缓存区前要对其进行判定里面的数据是否达到清除条件,即在getInstance()方法里要执行clearCache()方法
3、考虑到是公共区所以clearCache()方法必须是在一个线程类里,而这个类是单例类的内部类
4、相对的我们还需要一个往缓存区里加数据的方法,还有就是需要一个删除缓存的方法
5、数据在缓存区的标识就是时间和数据存在状态,所以需要另外一个实体类(CacheConfModel)来存放数据的录入时间(beginTime)和缓存允许存在的最大时间(durableTime)以及
数据状态(isForever)一般默认是false
有了以上5点,简单的缓存机制就基本实现了,clearCache()方法控制清除数据的代码,我只写个简单的原理了:
if(!cacheConfModel.isForever()){
if((new Date().getTime()-cacheConfModel.getBeginTime())>= cacheConfModel.getDurableTime()){
//清除数据
}
作者:
郑广昌
时间:
2012-12-30 23:41
学习学习!!!!
作者:
王玮
时间:
2013-1-1 14:13
import java.util.*;
public class CacheMgr {
private static Map cacheMap = new HashMap();
private static Map cacheConfMap = new HashMap();
private CacheMgr() {
}
private static CacheMgr cm = null;
public static CacheMgr getInstance() {
if (cm == null) {
cm = new CacheMgr();
Thread t = new ClearCache();
t.start();
}
return cm;
}
/** 增加缓存
* @param key
* @param value
* @param ccm 缓存对象
* @return
*/
public boolean addCache(Object key, Object value, CacheConfModel ccm) {
boolean flag = false;
cacheMap.put(key, value);
cacheConfMap.put(key, ccm);
System.out.println("now addcache==" + cacheMap.size());
return true;
}
/** * 删除缓存 * @param key * @return */
public boolean removeCache(Object key) {
cacheMap.remove(key);
cacheConfMap.remove(key);
System.out.println("now removeCache==" + cacheMap.size());
return true;
}
/**
* 清除缓存的类
*
*
*/
private static class ClearCache extends Thread {
public void run() {
while (true) {
Set tempSet = new HashSet();
Set set = cacheConfMap.keySet();
Iterator it = set.iterator();
while (it.hasNext()) {
Object key = it.next();
CacheConfModel ccm = (CacheConfModel) cacheConfMap.get(key);
// 比较是否需要清除
if (!ccm.isForever()) {
if ((new Date().getTime() - ccm.getBeginTime()) >= ccm
.getDurableTime() * 60 * 1000) {
// 可以清除,先记录下来
tempSet.add(key);
}
}
}
// 真正清除
Iterator tempIt = tempSet.iterator();
while (tempIt.hasNext()) {
Object key = tempIt.next();
cacheMap.remove(key);
cacheConfMap.remove(key);
}
System.out.println("now thread================>"
+ cacheMap.size());
// 休息
try {
Thread.sleep(60 * 1000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class CacheConfModel implements java.io.Serializable {
private long beginTime;
private boolean isForever = false;
private int durableTime;
public long getBeginTime() {
return beginTime;
}
public void setBeginTime(long beginTime) {
this.beginTime = beginTime;
}
public boolean isForever() {
return isForever;
}
public void setForever(boolean isForever) {
this.isForever = isForever;
}
public int getDurableTime() {
return durableTime;
}
public void setDurableTime(int durableTime) {
this.durableTime = durableTime;
}
}
复制代码
作者:
王玮
时间:
2013-1-1 14:16
有个东东叫 最近最久未被使用的 算法 ,进程调度的,应该与缓存也有关系。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2