`

轻量级缓存 EhCache 简介

    博客分类:
  • Java
阅读更多

转载自:http://blog.csdn.net/teedry/archive/2010/01/22/5225165.aspx

 

二级缓存

  • EHCache是一个快速的、轻量级的、易于使用的、进程内的缓存。它支持read-only和read/write缓存,内存和磁盘缓存。但是不支持集群(Clustering)。
  • OSCache是另外一个开源的缓存方案。它同时还支持JSP页面或任意对象的缓存。OSCache功能强大、灵活,和EHCache一样支持read-only和read/write缓存、支持内存和磁盘缓存。同时,它还提供通过JGroups或JMS进行集群的基本支持。
  • SwarmCache 是一个简单的、基于JavaGroups提供集群的缓存方案。支持read-only和nonstrict read/write缓存。这种缓存适用于读操作远远高于写操作频率的应用。
  • JBoss TreeCache 是一个强大的、可复制(同步或异步)和支持事务的缓存。如果你需要一个真正的支持事务的缓存架构,使用这个方案吧。

EHCache的使用场合

    1比较少更新表数据
        EhCache一般要使用在比较少执行write操作的表(包括update,insert,delete等)[Hibernate的二级缓存也都是这样];
    2 对并发要求不是很严格的情况
        两台机子中的缓存是不能实时同步的;

Ehcache的类层次模型
 

    主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单子的CacheManger,或者通过CacheManger的构造函数创建  一个新的CacheManger。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Element。Element则是我们用于存放要缓存内容的地方。

 

 

Hibernate的二级缓存策略的一般过程如下

    1条件查询的时候,总是发出一条select * from table_name where .... (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
    2 把获得的所有数据对象根据ID放入到第二级缓存中。
    3 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

 

    4 删除、更新、增加数据的时候,同时更新缓存。
    Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。

 

 

没有分布式缓存需求的配置:
1.先下载ehcache的jar包。
   最新版本: ehcache-1.4 released。
   解压后,有几个文件:
   ehcache-1.4.0.jar:需要将它放置到WEB-INF/lib下
   ehcache-1.4.0-remote-debugger.jar:不要发布到工程中,是用来调试和监控你的cache状况的
   ehcache-1.4.0-sources.jar:源代码
   ehcache.xml :重要的配置文件,需要复制到classpath下 。
2.ehcach.xml配置文件主要参数的解释,其实文件里有详细的英文注释//DiskStore 配置,cache文件的存放目录 ,主要的值有
   * user.home - 用户主目录
   * user.dir - 用户当前的工作目录
   * java.io.tmpdir - Default temp file path默认的temp文件目录
范例

 

1、首先设置EhCache,建立配置文件ehcache.XML,默认的位置在class-path,可以放到你的src目录下: 
 
<?xml version="1.0" encoding="UTF-8"?> 
<ehcache> 
 <diskStore path="Java.io.tmpdir"/> 
  <defaultCache 
   maxElementsInMemory="10000" <!
- 缓存最大数目 -> 
   eternal="false" <!- 缓存是否持久 -> 
   overflowToDisk="true" <!- 是否保存到磁盘,当系统当机时-> 
   timeToIdleSeconds="300" <!- 当缓存闲置n秒后销毁 -> 
   timeToLiveSeconds="180" <!- 当缓存存活n秒后销毁-> 
   diskPersistent="false" 
   diskExpiryThreadIntervalSeconds= "120"/> 
</ehcache> 
 

2、在Hibernate配置文件中设置: 
 

 

<!- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -> 
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 
 <!- 是否使用查询缓存 -
> 
 <property name="hibernate.cache.use_query_cache">true</property> 
 

说明一下:如果不设置"查询缓存",那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true才行。 
3、在Hbm.xml文件中在其<set></set>中添加<cache usage="read-only"/> 
4、如果需要"查询缓存",还需要在使用Query或Criteria()时设置其setCacheable(true);属性 
5、创建DAO,内容如下:

Session s = HibernateSessionFactory.getSession(); 
        Criteria c = s.createCriteria(Xyz.class); 
        c.setCacheable(true);//这句必须要有 
        System.out.println("第一次读取"); 
        List l = c.list(); 
        System.out.println(l.size()); 
        HibernateSessionFactory.closeSession(); 

        s = HibernateSessionFactory.getSession(); 
        c = s.createCriteria(Xyz.class); 
        c.setCacheable(true);//这句必须要有 
        System.out.println("第二次读取"); 
        l = c.list(); 
        System.out.println(l.size()); 
        HibernateSessionFactory.closeSession(); 

 

 
6、这时你会看到打印出来的信息为(表示第二次并没有去读库): 
        第一次读取 
        Hibernate: ***** 
        13 
        第二次读取 
        13 


首页的页面缓存 
      个网站的首页估计是被访问的次数最多的,我们可以考虑给首页做一个页面缓存 
   缓存策略:我认为应该是某个固定时间之内不变的,比如说2分钟更新一次,以应用结构page-filter-action-service-dao-db为例。 
        位置:页面缓存做到尽量靠近客户的地方,就是在page和filter之间 ,这样的优点就是第一个用户请求之后,页面被缓存,第二个用户再来请求的时候,走到filter这个请求就结束了,无需再走后面的action-service-dao-db。带来的好处是服务器压力的减低和客户段页面响应速度的加快。 
<cache name="SimplePageCachingFilter" 
             maxElementsInMemory="10" 
             maxElementsOnDisk="10" 
             eternal="false" 
             overflowToDisk="true" 
             diskSpoolBufferSizeMB="20" 
             timeToIdleSeconds="10" 
             timeToLiveSeconds="10"

 


             memoryStoreEvictionPolicy="LFU" 
              /> 
接着我们来看一下SimplePageCachingFilter的配置, 
<filter> 
    <filter-name>indexCacheFilterfilter-name> 
    <filter-class> 
       net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter 
    filter-class> 
  filter> 
  
<filter-mapping> 
    <filter-name>indexCacheFilter<filter-name> 
    <url-pattern>*index.action<url-pattern> 
  filter-mapping> 
就只需要这么多步骤,我们就可以给某个页面做一个缓存的,把上面这段配置放到你的web.xml中,那么当你打开首页的时候,你会发现,2分钟才会有一堆sql语句出现在控制台上。 
  cachefilter中还有一个特性,就是gzip,也就是说缓存中的元素是被压缩过的,如果客户浏览器支持压缩的话,filter会直接返回压缩过的流,这样节省了带宽,把解压的工作交给了客户浏览器,如果客户的浏览器不支持gzip,那么filter会把缓存的元素拿出来解压后再返回给客户浏览器(大多数爬虫是不支持gzip的,所以filter也会解压后再返回流),这样做的优点是节省带宽,缺点就是增加了客户浏览器的负担。 
                                                                                         

 


 Ehcache的三种清空策略                                                     
1 FIFO,first in first out,这个是大家最熟的,先进先出。 
2 LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。 
3 LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

分享到:
评论

相关推荐

    springboot整合Ehcache组件,轻量级缓存管理

    二级缓存:是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二级缓存默认是关闭的,如果要使用需要手动开启,并且依赖EhCache组件。 三级缓存:查询缓存,配置开启该缓存的情况下,重复使用一个...

    Hibernate中二级缓存ehcache缓存案例

    ehcache是Hibernate官方推荐的二级缓存实现,它是一个高性能、轻量级的缓存框架。使用ehcache可以将频繁访问的数据存储在内存中,避免了频繁的数据库交互,从而提高了系统的响应速度。ehcache具有可扩展性,支持磁盘...

    SpringBoot2 整合Ehcache组件,轻量级缓存管理.docx

    SpringBoot2 整合 Ehcache 是为了实现轻量级的缓存管理,Ehcache 是一个流行的、基于 Java 的进程内缓存框架,它提供了快速、易于使用的特性,尤其适用于小型到中型应用。在 Hibernate 中,Ehcache 作为默认的二级...

    Java缓存框架 EhCache

    EhCache是一个广泛使用的开源Java缓存框架,它以其高效、轻量级和易于集成的特性,在Java开发领域中占据了重要的地位。作为进程内缓存解决方案,EhCache能够在应用程序运行时存储数据,显著提高数据访问速度,减轻...

    Ehcache分布式缓存与其在SpringBoot应用

    Ehcache是一个高性能的、基于Java的进程内缓存解决方案,它被广泛应用于各种Java应用程序,包括Java EE和轻量级容器。Ehcache的主要优势在于它的快速响应、易用性和丰富的缓存策略。它提供了两种级别的缓存存储:...

    基于spring boot上的注解缓存,自带轻量级缓存管理页面.zip

    本项目主题是"基于Spring Boot上的注解缓存,自带轻量级缓存管理页面",这涉及到Spring Boot如何集成和管理缓存,以及如何通过注解来实现这一功能。在快应用开发中,缓存优化是提升系统性能、减少数据库负载的关键...

    SpringBoot2 整合Ehcache组件,轻量级缓存管理的原理解析

    SpringBoot2 整合Ehcache组件,轻量级缓存管理的原理解析 本文主要介绍了SpringBoot2 整合Ehcache组件,轻量级缓存管理的原理和实现。Ehcache是一个纯Java的进程内缓存框架,具有快速、上手简单等特点,是Hibernate...

    Spring 与Ehcache实现基于方法的缓存

    在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,它为开发者提供了强大的依赖注入(DI)和面向切面编程(AOP)功能。Ehcache则是一款广泛使用的开源缓存解决方案,用于提高应用程序性能,减少数据库...

    Aspect Cache是一个针对Spring Boot,基于AOP注解方式的轻量级缓存

    Aspect Cache是一个针对Spring Boot,基于AOP注解方式的轻量级缓存,目前支持EHCache,Redis缓存方式。数据类型支持POJO、Map和List数据类型,同时支持自定义缓存key解析,也支持自定义的缓存处理方式,或者扩展支持...

    SpringBoot 集成Ehcache实现缓存

    Ehcache是一个高效的纯Java进程内缓存框架,以其快速且轻便的特点而被广泛应用于各种应用场景中,尤其在Java EE和轻量级容器环境中更是受到青睐。Ehcache支持多种缓存策略,包括内存和磁盘存储,提供了缓存加载器、...

    ehcache 缓存

    Ehcache是一款开源、高性能、轻量级的Java缓存框架,广泛应用于各种Java应用程序中,以提高数据访问速度并降低数据库负载。它的核心特性包括内存缓存、磁盘存储和分布式缓存,使得在大数据量下也能保持高效的性能。 ...

    springMybatis+redis三级缓存框架

    首先,MyBatis作为一款轻量级的持久层框架,其核心特性之一就是支持自定义的SQL查询。MyBatis的二级缓存机制允许我们将执行过的SQL查询结果存储在内存中,以供后续相同的查询直接使用,从而避免了重复的数据库访问。...

    ehcache缓存

    然而,对于轻量级应用,Guava Cache可能更为简洁高效。 **五、最佳实践** 1. **合理设置缓存大小**:根据应用需求和硬件资源调整缓存容量,避免内存溢出。 2. **监控和调优**:使用Ehcache提供的监控工具,实时...

    EHcache缓存框架

    EHcache的设计目标是轻量级、高性能且易于使用,使得开发者能够快速集成到自己的应用中。 **EHcache基础** 1. **缓存层次结构**:EHcache支持多级缓存,包括内存和磁盘存储。内存缓存提供了快速访问,而磁盘缓存...

    ehcache 缓存技术

    EHCache是一款高性能、轻量级的Java缓存框架,它广泛应用于各种Java应用程序中,特别是需要提升数据访问速度和减少数据库负载的场景。EHCache是基于内存的,但同时支持持久化,能有效地提高系统的响应速度和整体性能...

    基于java的ehcache(Java缓存框架 EhCache).zip

    - 与Guava Cache对比:Guava Cache是Google提供的轻量级缓存,适用于简单场景,而EhCache功能更强大,更适合大型企业应用。 7. 性能优化: - 使用内存管理策略:例如设置内存池、调整缓存大小以优化内存使用。 -...

    EHCache缓存

    1. **快速轻量**:EHCache 被誉为最快的 Java 缓存之一。经过严格的性能测试,证明其线程机制专为高并发系统设计,易于使用,便于部署上线及运行维护。 2. **伸缩性**:无论是内存还是磁盘存储,EHCache 都能轻松...

    Ehcache分布式缓存入门案例demo_文件转树结构_

    Ehcache是一个高性能、轻量级的Java分布式缓存库,它被广泛应用于提升应用程序的性能,通过存储经常访问的数据来减少对数据库的依赖,从而加快系统的响应速度。本入门案例将带你了解如何使用Ehcache实现分布式缓存,...

    基于Java的源码-ehcache(Java缓存框架 EhCache).zip

    EhCache的设计目标是提供快速、轻量级的缓存解决方案,支持多线程环境,并且能够很好地与其他Java技术如Spring、Hibernate等集成。 1. **EhCache的基本概念** - **缓存**:缓存是一种存储常用数据的技术,用于减少...

Global site tag (gtag.js) - Google Analytics