dfrank的gravatar头像
dfrank 2014-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 下载
最代码最近下载分享源代码列表最近下载
qcxdld  LV1 2020年9月23日
gan857569302  LV9 2020年6月23日
luohaipeng  LV23 2019年11月20日
低调人  LV38 2019年8月4日
Tiger_Peppa  LV2 2019年6月19日
幽幻梦之韩霜  LV10 2018年9月4日
1324488732  LV27 2017年12月22日
silent  LV12 2017年9月27日
zl_lin  LV2 2017年1月3日
zyl  LV34 2016年6月22日
最代码最近浏览分享源代码列表最近浏览
CrystalQ  LV8 2023年5月30日
hxx123456789  LV10 2021年8月13日
qcxdld  LV1 2020年9月23日
wkc  LV21 2020年7月29日
gan857569302  LV9 2020年6月22日
luv583774  LV1 2020年6月11日
weixiao  LV6 2020年5月18日
1033755143  LV17 2020年5月8日
弥尘123456  LV4 2020年2月19日
luohaipeng  LV23 2019年11月20日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友