一个模仿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. 小爬虫。爬取网站多页的通知标题并存取在txt文档里。

    爬取网页中通知标题的内容展示: this is  1  page!<精算学综合>科目考试参考大纲2016年上半年研究生开题报告评议审核结果公示[答辩]2016下半年研究生论文答辩及学位评定 ...

  2. iOS: 学习笔记, 使用FMDatabase操作sqlite3

    使用FMDatabase操作sqlite3数据库非常简单和方便 // // main.m // iOSDemo0602_sqlite3 // // Created by yao_yu on 14-6- ...

  3. C语言-06数据类型-05 总结

    一.基本数据类型1.int1> long int.long:8个字节 %ld2> short int.short:2个字节 %d %i3> unsigned int.unsigned ...

  4. Makefile的简单例子

    1.生成test可执行文件,源文件有prog.c prog.h cord.h test:prog.o code.o gcc -o test prog.o code.o prog.o:prog.c pr ...

  5. CoreProfiler/NanoProfiler

    使用CoreProfiler/NanoProfiler实现跨平台&应用的整合性能调试 摘要 NanoProfiler是一个开源.NET性能调试类库,CoreProfiler是其.NET Cor ...

  6. 全连接的BP神经网络

    <全连接的BP神经网络> 本文主要描述全连接的BP神经网络的前向传播和误差反向传播,所有的符号都用Ng的Machine learning的习惯.下图给出了某个全连接的神经网络图. 1前向传 ...

  7. 在linux下的apache配置https协议,开启ssl连接

    环境:linux 配置https协议,需要2大步骤: 一.生成服务器证书 1.安装openssl软件 yum install -y openssl mod_ssl 2.生成服务器私匙,生成server ...

  8. h.264 scanning process for transform coefficients

    宏块在经过变换.量化后,得到大小为4x4或者8x8的矩阵,矩阵中的数据被称为transform coefficient levels.这些level在后面会被用于熵编码,因此我们需要把矩阵按照一定顺序 ...

  9. MFC应用程序创建窗口的过程 good

    MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该 ...

  10. 关于IN-LIST迭代

    IN-list iterator (IN-list迭代) 字段有索引,in里有多少个值就执行多少次索引扫描.不管值是否在字段里存在~ SQL> create table t1 as select ...