问题描述

应用在使用过程中会需要重启等,但是如果ehcache随着应用一起重启,那么刚重启的时候就会出现大量的miss,需要一定的访问量来重建缓存,如果缓存能够持久化,重启之后可以复用将会有助于缓解重启的缓存miss

解决办法

ehcache支持在关闭时将缓存持久化到指定的硬盘目录

	<cache name="persistCache"  eternal="true"
diskPersistent="true" >
</cache>
<diskStore path="c:/data" />

通过配置diskPersistent=true(cache级)以及diskStore(配置文件级)在应用shutdown的时候会生成对应的序列化文件。

	@Test
public void persist() throws InterruptedException{
CacheManager cache=CacheManager.create("cache.xml");
Ehcache persistCache=cache.addCacheIfAbsent("persistCache");
persistCache.put(new Element(1,new Student("a")));
persistCache.put(new Element(2,new Student("b")));
cache.shutdown();
}
@Test
public void resume() throws InterruptedException{
CacheManager cache=CacheManager.create("cache.xml");
Ehcache persistCache=cache.getEhcache("persistCache");
System.out.println(((Student)persistCache.get(1).getObjectValue()).getName());
System.out.println(((Student)persistCache.get(2).getObjectValue()).getName());
cache.shutdown();
}

运行两个测试案例,在第二个的输出中会得到第一个存入的值a、b,需要注意的是其中存入的对象需要实现serializable接口。

在查看响应的存储目录时,会看到两个文件"cache名.data"及"cache名.index"。

序列化及反序列化

在调用shutdown方法的时候,ehcache会dispose底层的cache从而实现序列化到硬盘(貌似只能使用java默认的序列化,所以对象要实现serializable)。

在data文件中存放的是存入的Element对象,在index文件中存放的是key的值以及对应的diskMarker对象,这个对象主要存放了element在data文件中的偏移量及大小。当cache启动发现存在持久化文件时,它并不会主动去加载,当调用get,它会在index中寻找是否有命中,如果有,则会取出对应的diskMarker,再去data文件根据偏移量来寻找对应的数据进行反序列化,这也减小初始化的过程的压力,不用将全部对象反序列化。

其中要注意的是序列化的过程只有发生在调用shutdown的时候。如果无法显示调用shutdown方法可以通过设置系统参数System.setProperty("net.sf.ehcache.enableShutdownHook","true");在jvm关闭是调用钩子,从而调用shutdown,当然如果强制关闭进程是无效的。

ehcache2拾遗之cache持久化的更多相关文章

  1. ehcache2拾遗之write和load

    问题描述 在cache系统中writeThrough和writeBehind是两个常用的模式. writeThrough是指,当用户更新缓存时,自动将值写入到数据源. writeBehind是指,在用 ...

  2. ehcache2拾遗之copyOnRead,copyOnWrite

    问题描述 缓存在提升应用性能,提高访问效率上都是至关重要的一步.ehcache也是广为使用的缓存之一.但是如果将一个可变的对象(如普通的POJO/List/Map等)存入缓存中,会导致怎样潜在的问题. ...

  3. Cache架构设计

    Cache策略 定时过期策略 定时过期的好处是Cache节点的个数符合实际需求,不会造成资源滥用和服务器压力 定时过期适合访问量较大,实时性要求不高的情况 如果访问量小,定时过期会造成Cache命中率 ...

  4. spark持久化

    spark持久化:cache .persist.checkpoint 一.cache持久化 cache实际上是persist的一种简化方式,是一种懒执行的,执行action类算子才会触发,cahce后 ...

  5. Spark(开课吧笔记)

    2016.07.14 1-Spark实战演练:Spark概述及生态环境 2.Spark实战演练:Spark vs Hadoop MapReduce     任意一条边有方向且不存在环路的图,一次执行所 ...

  6. SpringCache学习之操作redis

    一.redis快速入门 1.redis简介 在java领域,常见的四大缓存分别是ehcache,memcached,redis,guava-cache,其中redis与其他类型缓存相比,有着得天独厚的 ...

  7. Spark计算模型RDD

    RDD弹性分布式数据集 RDD概述 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行 ...

  8. 【sparkStreaming】SparkStream的创建

    DStream编程数据模型 DStream(Discretized Stream)作为Spark Streaming的基础抽象,它代表持续性的数据流. 这些数据流既可以通过外部输入源赖获取,也可以通过 ...

  9. 【spark】连接Hbase

    0.我们有这样一个表,表名为Student 1.在Hbase中创建一个表 表明为student,列族为info 2.插入数据 我们这里采用put来插入数据 格式如下   put  ‘表命’,‘行键’, ...

随机推荐

  1. SGA(System Global Area)

    系统激活时在内存内规划的一个固定的区域,用于存储每位使用者所需存取的数据和必备的系统信息.这个区域成为系统全局区. 数据块缓存区:存放读取数据文件的数据块副本,或者曾经处理过的数据.有效减少读取数据时 ...

  2. 也说说angularJs里的evalAsync

    虽说angular都快出2.0了,到了2.0这些东东都会被干掉.不过我们眼前的事还是要处理. $evalAsync和$timeout到底什么区别,网上说法很多,最近看到的是说在directive里就怎 ...

  3. android nio

    Android开发进阶之NIO非阻塞包(二) 有关Android NIO我们主要分为三大类,ByteBuffer.FileChannel和SocketChannel.由于篇幅原因今天Android12 ...

  4. codingNet项目的创建

    首先,在codingNet上面创建一个项目(一般情况下) 然后,在本地打开项目并添加到储存库 其次,提交代码到已经创建好的项目中(注意赋值远程存储库的路径)

  5. Oracle表空间数据文件移动的方法

    最近遇到这样的一个问题,Oracle存放表空间文件的盘符 空间不够了,必须把部分表空间迁移出去, [转]http://www.jb51.net/article/77026.htm 实现把用户表空间中的 ...

  6. JSTL和EL表达式多重if问题

    俾人以前在写一个查询功能时,由于结果状态分好几种,于是页面就用<c:if></c:if>写了一大堆来判断,后来上网查了下资料,发现有个语法类似于多重if,挺方便的,语法是 &l ...

  7. Ubuntu16.04下面配置java环境变量

    我在ubuntu 16.04下面配置java环境变量的时候,开始在网上查信息的时候,没太注意ubuntu的版本,结果在.bashrc下面设置,在.profile下面设置,都不成功, 后面才想起来搜索u ...

  8. MySQL执行计划解读

    Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...

  9. struts2是如何加载相关的package元素节点信息的

    这不是一篇纯技术文章,而是一篇分享我个人在前后端分离路上收获的点点滴滴的文章,以此来为准备尝试前后端分离或者想了解前后端分离的童鞋做一个大体的讲解. 上一家公司是家小公司,做了一年的全栈开发,对前端的 ...

  10. loading动画效果记录

    看到好多网页都有一个炫酷的loading动画,以前不知道怎么实现的.今天学习了一下,发现其实也很简单. 首先在学习的时候偶然遇到一个pace.js的库,非常好用.优点是,不需要挂接到任何代码,自动检测 ...