最代码广告位
dfrank的gravatar头像
dfrank2014-06-26 18:55:47

java Map实现的cache manager

一个模仿memcached的JAVA虚拟缓存工具,可以缓存java对象;

突然想到就搞出来了,具体好像也没有什么用......汗

更新:

   感谢牛大大的提醒,老的代理确实存在线程方面的问题,下面是更新的版本,老的版本放入到附件中了

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

/**
 * java Map cache manager 改进版
 * 特点:无线程,取出时判断过期,系列化实现的深度克隆,覆盖原则
 * 问题: 线程安全,克隆带来的时效损耗
 * @author frank
 *
 */
public class VirtualCache{
    
    /**
     * 开发模式
     */
    private boolean isdev = false;
    
    private static String ERROR_SET = "VirtualCache缓存数据异常:key=";
    
    private static String ERROR_GET= "VirtualCache取出数据异常:key=";
    
    /**
     * 虚拟缓存
     */
    private Map<String,Object> cache = new ConcurrentHashMap<String, Object>();
    
    /**
     * 过期时间
     */
    private Map<String,Long> tasks = new ConcurrentHashMap<String,Long>();
    
    public VirtualCache(boolean isdev){
        this.isdev = isdev;
    }
    
    public VirtualCache(){
        
    }
    
    /**
     * 深度克隆
     */
    private Object clone(String key,Object obj,boolean isSet){
    	if(obj == null)
    		return null;
        ByteArrayOutputStream bo = null;
        ObjectOutputStream oo = null;
        ByteArrayInputStream bi = null;
        ObjectInputStream oi = null;
        Object value = null;
        try {
            bo=new ByteArrayOutputStream();
            oo = new ObjectOutputStream(bo);
            oo.writeObject(obj);
            bi=new ByteArrayInputStream(bo.toByteArray());
            oi=new ObjectInputStream(bi);
            value = oi.readObject();
        } catch (Exception e) {
        	this.printError(e, key,isSet);
        } finally{
            if(oo != null)
                try {
                    oo.close();
                } catch (Exception e) {
                	this.printError(e, key,isSet);
                }
            if(oi != null)
                try {
                    oi.close();
                } catch (Exception e) {
                	this.printError(e, key,isSet);
                }
        }
        return value;
    }
    
    /**
     * 日志输出
     */
    private void printError(Exception e,String key,boolean isSet){
    	if(isSet)
    		System.err.println(ERROR_SET + key);
    	else
    		System.err.println(ERROR_GET + key);
        if(this.isdev)
            e.printStackTrace();
    }
    
    /**
     * 存入缓存
     */
    public void set(String key,Object value,long timeout){
        this.delete(key);
        this.cache.put(key, this.clone(key,value,true));
        if(timeout > 0l)
        	this.tasks.put(key,timeout*1000l + System.currentTimeMillis());
    }
    
    /**
     * 获取缓存
     */
    public Object get(String key){
    	Long timeout = this.tasks.get(key);
		if(timeout != null && timeout <= System.currentTimeMillis())
			this.delete(key);
		return this.clone(key,this.cache.get(key),false);
    }

    /**
     * 删除缓存
     */
    public void delete(String key){
    	this.cache.remove(key);
    	this.tasks.remove(key);
    }
    
}

官方验证:

这个cache实现和该代码类似,但存在线程安全问题

分享一个Map,定时清除缓存起来的值


最代码官方编辑于2016-12-16 10:22:36


打赏

文件名:VirtualCache.旧版.java,文件大小:4.68K下载
最代码最近下载分享源代码列表最近下载
luohaipeng LV232019年11月20日
太阳月亮星星星星星星
筱进GG LV382019年8月4日
太阳太阳月亮星星星星
Tiger_Peppa LV22019年6月19日
星星星星
幽幻梦之韩霜 LV102018年9月4日
月亮月亮星星星星
1324488732 LV272017年12月22日
太阳月亮月亮星星星星星星
silent LV122017年9月27日
月亮月亮月亮
zl_lin LV22017年1月3日
星星星星
zyl LV342016年6月22日
太阳太阳星星星星
huangxing LV62016年1月6日
月亮星星星星
东北人 LV112015年12月13日
月亮月亮星星星星星星
最代码最近浏览分享源代码列表最近浏览
weixiao LV45月18日
月亮
1033755143 LV175月8日
太阳星星
弥尘123456 LV42月19日
月亮
luohaipeng LV232019年11月20日
太阳月亮星星星星星星
孙龙52 LV62019年11月9日
月亮星星星星
annazhang LV242019年9月17日
太阳月亮月亮
lelelada LV62019年9月5日
月亮星星星星
筱进GG LV382019年8月4日
太阳太阳月亮星星星星
chenyiiqng LV52019年7月11日
月亮星星
5420290772019年7月5日
暂无贡献等级
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友