一个模仿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);
} }

java Map实现的cache manager的更多相关文章

  1. Ehcache(2.9.x) - API Developer Guide, Cache Manager Event Listeners

    About CacheManager Event Listeners CacheManager event listeners allow implementers to register callb ...

  2. Caused by: java.lang.NoClassDefFoundError: freemarker/cache/TemplateLoader

    1.错误描写叙述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -he ...

  3. Java map 详解 - 用法、遍历、排序、常用API等

    尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...

  4. java map遍历、排序,根据value获取key

    Map 四种遍历: Map<String,String> map = new HashMap<String, String>(); map.put("one" ...

  5. java Map常用方法封装

      java Map常用方法封装 CreationTime--2018年7月16日15点59分 Author:Marydon 1.准备工作 import java.util.HashMap; impo ...

  6. Java Map获取key和value 以及String字符串转List方法

    一.问题描述 这里描述两个问题: 1.Java Map获取key和value的方法: 2.String字符串转List的方法: 二.解决方法 1.Java Map获取key和value的方法   2. ...

  7. java map添加另一个map时候 键值对的类型要一致

    java map添加另一个map时候 键值对的类型要一致

  8. RxVolley报错:Caused by: java.lang.RuntimeException: RequestQueue-> DiskBasedCache cache dir error

    Caused by: java.lang.RuntimeException: RequestQueue-> DiskBasedCache cache dir error 这是因为SD卡动态权限导 ...

  9. java:Map借口及其子类HashMap五,identityHashMap子类

    java:Map借口及其子类HashMap五,identityHashMap子类 了解:identityHashMap子类 一般情况下,标准的Map,是不会有重复的key值得value的,相同的key ...

随机推荐

  1. C语言的指针

    指针是C语言中非常重要的数据类型,那么什么是指针呢? 指针类型就是用来用来存放变量地址的变量,指向某个变量. 指针的一般形式:*指针变量名 int *p; float *p1; “*”是用来说明这个变 ...

  2. GIF文件转换为头文件工具

    目的: GIF文件转为头文件 举例: 用UE打开GIF文件,如下图所示:图1 test.gif文件将上面文件内容转化为头文件,放到一个数组里面,内容如下:图2 test.h文件 思路: 从上面可知,将 ...

  3. Java网络编程--echo服务器

    客户端使用Java的阻塞IO 服务端使用Java的非阻塞NIO package com.nio.echo; import java.io.IOException; import java.io.Inp ...

  4. RPC通信编程

    使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大.最高效的方法之一.它为在分布式计算环境中运行的几乎所有应用程序提供基础. RPC 是什么? RPC 的全称是 Remote Proce ...

  5. Html和JS基础

    1.body:bgcolor,background(背景图片),bgproperities=fixed(图片水印),text(正文颜色). 2.hr:水平分割线,正文标题<h?>自动换行了 ...

  6. Matlab绘图系列之高级绘图

    Matlab绘图系列之高级绘图 原帖地址: http://blog.163.com/enjoy_world/blog/static/115033832007865616218/ Matlab绘图 20 ...

  7. GemFire

    一.GemFire是什么?   如果你了解Redis或memCached,那么恭喜,你很快就能理解GemFire是什么,没错,你可以把它理解为一个增强版的Redis,具体在哪些方面增强,我们日后慢慢聊 ...

  8. Python3.x和Python2.x的区别-转

    这个星期开始学习Python了,因为看的书都是基于Python2.x,而且我安装的是Python3.1,所以书上写的地方好多都不适用于Python3.1,特意在Google上search了一下3.x和 ...

  9. 《深度探索c++对象模型》chapter2 构造函数语义学

    关于c++,最常听到的一个抱怨是,编译器背着程序员做了太多事情,conversion运算符是最常被引用的一个例子:jerry schwarz,iostream函数库的建筑师,就曾经说过一个故事,他说他 ...

  10. BZOJ2083: [Poi2010]Intelligence test

    2083: [Poi2010]Intelligence test Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 241  Solved: 96[Sub ...