您的位置:首页 > 其它

Ehcache缓存 --- 简单入门

2017-12-19 15:13 197 查看
一、Ehcache介绍

Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

Ehcache最初是由Greg Luck于2003年开始开发。2009年,该项目被Terracotta购买。软件仍然是开源,但一些新的主要功能(例如,快速可重启性之间的一致性的)只能在商业产品中使用,例如Enterprise EHCache and BigMemory。维基媒体Foundationannounced目前使用的就是Ehcache技术。

二、Ehcache特性

快速
简单
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
提供Hibernate的缓存实现
多种缓存策略,Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多

三、Ehcache缺点

使用磁盘Cache的时候非常占用磁盘空间:这是因为DiskCache的算法简单,该算法简单也导致Cache的效率非常高。它只是对元素直接追加存储。因此搜索元素的时候非常的快。如果使用DiskCache的,在很频繁的应用中,很快磁盘会满。
不能保证数据的安全:当突然kill掉java的时候,可能会产生冲突,EhCache的解决方法是如果文件冲突了,则重建cache。这对于Cache数据需要保存的时候可能不利。当然,Cache只是简单的加速,而不能保证数据的安全。如果想保证数据的存储安全,可以使用Bekeley DB Java Edition版本。这是个嵌入式数据库。可以确保存储安全和空间的利用率。

四、Ehcache参数配置

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

<diskStore path="E:/ehcache"/>

<!--
maxElementsInMemory:缓存中允许创建的最大对象数
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
timeToIdleSeconds=y:缓存创建以后,最后一次访问缓存的日期至失效之时的时间间隔y;
timeToLiveSeconds=x:缓存自创建日期起至失效时的间隔时间x;
overflowToDisk:内存不足时,是否启用磁盘缓存。
maxElementsOnDisk:硬盘最大缓存个数。
-->
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
maxElementsOnDisk="10000000" />

<!-- 系统缓存 -->
<!--
name: 缓存名称
maxElementsInMemory:缓存中允许创建的最大对象数
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
overflowToDisk:内存不足时,是否启用磁盘缓存。
-->
<cache
name="sysCache"
maxElementsInMemory="1000"
eternal="true"
overflowToDisk="true"/>

<!--
name: 缓存名称
maxElementsInMemory:缓存中允许创建的最大对象数
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
timeToIdleSeconds=y:缓存创建以后,最后一次访问缓存的日期至失效之时的时间间隔y;
timeToLiveSeconds=x:缓存自创建日期起至失效时的间隔时间x;
overflowToDisk:内存不足时,是否启用磁盘缓存。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存
缓存的3种清空策略:
LRU---Least Recently Used(最近最少使用)---ehcache默认策略:缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
LFU---Less Frequently Used(最少使用):一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
FIFO---First In First Out(先进先出)

-->
<cache
name="categoryCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>


五、Ehcache准备环境

(1)引入Ehcache依赖的jar

ehcache-2.10.1.jar
log4j-1.2.16.jar
slf4j-api-1.7.7.jar
slf4j-jdk14-1.7.7.jar
slf4j-log4j12-1.7.2.jar

(2)在src目录下创建ehcache.xml配置文件

六、实例

//读取配置文件:通过类加载器访问配置文件
CacheManager cacheManager = CacheManager.create(
CategoryServiceImpl.class.getClassLoader().getResourceAsStream("ehcache.xml"));

//从配置文件中获取名称为categoryCache缓存区
Cache cache = cacheManager.getCache("categoryCache");

//判断缓存中是否有list集合
Element element = cache.get("list");
List<Category> list = null;
if(element == null){
//缓存中没有数据
System.out.println("==========缓存中没有数据,查询数据库==========");
CategoryDao categoryDao = (CategoryDao) BeanFactory.getBean("categoryDao");
list = categoryDao.findAll();
element = new Element("list", list);
cache.put(element);

}else{
//缓存中已有数据
System.out.println("==========缓存中有数据,没有查询数据库==========");
list = (List<Category>) element.getObjectValue();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: