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准备环境
(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配置文件
六、实例
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(); }
相关文章推荐
- Mybatis入门实例(二)——添加ehcache缓存支持
- Spring AOP+ehCache简单缓存系统解决方案
- Java缓存组件 EhCache 入门教程
- Java Ehcache缓存框架入门级使用实例
- Spring AOP+ehCache简单缓存系统解决方案
- 使用Ehcache缓存在用户输错n次账户密码之后冻结m小时的简单实现
- Spring AOP+ehCache简单缓存系统解决方案
- Java缓存组件 EhCache 入门教程
- java缓存框架---ehcache简单实例
- Java缓存组件 EhCache 入门教程
- Spring AOP+ehCache简单缓存系统解决方案
- 关于Redis中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等概念的入门及简单解决方案
- Spring AOP+ehCache简单缓存系统解决方案
- Asp.Net MVC3 简单入门详解过滤器Filter(身份验证、缓存、防盗链、国际化等)
- Ehcache缓存简单理解
- springboot 缓存ehcache的简单使用
- Spring Security 入门(1-8)缓存EhCache
- Mybatis入门实例(二)——添加ehcache缓存支持
- Spring AOP+ehCache简单缓存系统解决方案
- 页面缓存 ehcache(简单的)