使用Map实现java缓存,但是如何从缓存中获取数据呢,我一直取值是空的

kanguhong 2016-12-21 06:11:21
新手请各位大神指教,
以下是代码:
一、CacheMgr .java
package cache.com;

import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class CacheMgr {

private static Map cacheMap = new HashMap();
private static Map cacheConfMap = new HashMap();

private static CacheMgr cm = null;

//构造方法
private CacheMgr(){
}



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){
System.out.println("开始增加缓存-------------");
boolean flag = false;
cacheMap.put(key, value);
cacheConfMap.put(key, ccm);
System.out.println("增加缓存结束-------------");
System.out.println("now addcache=="+cacheMap.size());
return true;
}


/**
* 获取缓存实体
*/
public Object getValue(String key){
Object ob=cacheMap.get(key);
if(ob!=null){
return ob;
}else{
return null;
}
}


/**
* 获取缓存数据的数量
* @return
*/
public int getSize(){
return cacheMap.size();
}




/**
* 删除缓存
* @param key
* @return
*/
public boolean removeCache(Object key){
cacheMap.remove(key);
cacheConfMap.remove(key);

System.out.println("now removeCache=="+cacheMap.size());

return true;
}



/**
* 清除缓存的类
* @author wanglj
* 继承Thread线程类
*/
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();
}
}
}
}


}


二、CacheConfModel.java
package cache.com;

public 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;
}

}

...全文
1811 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kanguhong 2016-12-22
  • 打赏
  • 举报
回复
谢谢各位,菜鸟的我明白了
爱睡觉的阿狸 2016-12-22
  • 打赏
  • 举报
回复
引用 4 楼 u012255097 的回复:
public static void main(String[] args) { //addData();//添加缓存 int num=getData();//取缓存个数 System.out.println(num); } 我是先执行添加缓存,然后注掉,再执行取值,这时就是0了;我不太了解缓存这方面的知识,是不是我这种做法不对。
你程序都结束了,缓存自然也释放了啊。
  • 打赏
  • 举报
回复
引用 4 楼 u012255097 的回复:
public static void main(String[] args) { //addData();//添加缓存 int num=getData();//取缓存个数 System.out.println(num); } 我是先执行添加缓存,然后注掉,再执行取值,这时就是0了;我不太了解缓存这方面的知识,是不是我这种做法不对。
程序运行结束后内存就被回收了,要想使程序重启后仍能得到数据,需要把数据存到磁盘中
kanguhong 2016-12-22
  • 打赏
  • 举报
回复
public static void main(String[] args) { //addData();//添加缓存 int num=getData();//取缓存个数 System.out.println(num); } 我是先执行添加缓存,然后注掉,再执行取值,这时就是0了;我不太了解缓存这方面的知识,是不是我这种做法不对。
bigbaldy 2016-12-22
  • 打赏
  • 举报
回复
不是0呀,完全用的你的代码,我执行结果是1
kanguhong 2016-12-22
  • 打赏
  • 举报
回复
这是我写的一个测试类:
package com.test;

import java.util.Date;

import cache.com.CacheConfModel;
import cache.com.CacheMgr;

public class Testc {
	
	public  static  void main(String[] args) {
		//addData();//添加缓存
		int num=getData();//取缓存个数
		System.out.println(num);
	}
	
	
	public static synchronized void addData(){
		System.out.println("进入getData()…………………………");
		CacheMgr cm=CacheMgr.getInstance();
		CacheConfModel cModel=new CacheConfModel();
		Date d=new Date();
		cModel.setBeginTime(d.getTime());
		cModel.setDurableTime(6000);
		cModel.setForever(true);
		cm.addCache("kk", "123", cModel);
	}
	
	public static synchronized int getData(){
		CacheMgr cm=CacheMgr.getInstance();
		int num=cm.getSize();
		System.out.println("num====="+num);
		return num;
	}
	
	

}
我在添加了缓存后再取缓存个数总是0
I,Frankenstein 2016-12-21
  • 打赏
  • 举报
回复
看下你在哪里取得是取不到值?另外,作为缓存,是工程全局数据,建议增删的时候加上同步。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧