一个模仿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. python基础 [Alex视频]

    vi hello.py#!/usr/bin/env pythonprint "hello world!"while True: print("hello world!&q ...

  2. The largest prime factor(最大质因数)

    1. 问题: The prime factors of 13195 are 5, 7, 13 and 29.What is the largest prime factor of the number ...

  3. Socket 错误总结

    错误 因为并没有搞清楚accept函数的使用,所以导致不停的发送失败,同时还不知道错误在哪里,无意中看见errno这个库,可以记录错误的原因,才知道原因在于没有用客户端的套接字进行接收数据,而这个客户 ...

  4. VS 调试相关

    最近用VS2013 调试遇到的一点小问题,老年痴呆做一下记录. 1. IIS 用 w3wp.exe 调试: IIS 中的文件系统与工程的保持一致,否则断点不会命中: 发布文件系统后,重启站点对应的应用 ...

  5. 转-[Python 学习]2.5版yield之学习心得

    在 shhgs 发布了关于< Py 2.5 what’s new 之 yield>之后,原来我不是特别关注 yield 的用法,因为对于2.3中加入的yield相对来说功能简单,它是作为一 ...

  6. JSch - Java实现的SFTP(文件上传详解篇)(转)

    JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到 ...

  7. pojo类和vo类分别是什么

    转:http://blog.sina.com.cn/s/blog_4adc4b090101kuks.html vo有两种说法,一个是viewObject,一个是valueObject.. 就拿前者来说 ...

  8. Delphi实现WebService带身份认证的数据传输

    WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台.跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨 ...

  9. java jdbc使用配置文件连接数据库:

    java jdbc使用配置文件连接数据库: 创建后缀名为:.properties的文件,文件内容包括,数据库驱动.连接的数据库地址.用户名.密码…… 以Mysql为例创建config.properti ...

  10. python 正则表达式(一)

    正则表达式(regular exprssion)是一种形式化语法描述的文本匹配模式.模式被解释为一组指令,然后会执行这组指令.以一个字符串作为输入,生成一个匹配的子集或源字符串的修改版本. 表达式可以 ...