`

ehcache2.8.3入门示例:hello world,以及在spring中使用

 
阅读更多

一、pom.xml 依赖项

 

<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
		</dependency>
		<dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.8.3</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
	</dependencies>

 

 

二、ehcache.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
参数的含义分别是:
a.maxElementInMemory表示该缓存中可以放置多少个对象,此处为1000个,根据内存的多少可以配置
b.eternal表示是否设置这些放入二级缓存的数据对象为永久的(即放入即保存,不再清除)一般都为false
c.timeToIdleSeconds=120表示如果120秒内,放入的对象没有被再次访问到,就清除出去
d.timeToLiveSeconds=120表示对象在缓存中存活的时间,一个对象进入到本缓存中120秒后,就会自动被清除(一般	设置的时间会比timeToIdleSeconds时间长),设置此属性是为了让更多活跃的对象进入到缓存中来。
e.overflowToDisk="true"表示如果活跃对象已经超出maxElementInMemory设置的最大值时,超出的对象要被写入到硬盘上保存下来,用于缓解活跃用户较多的情况。
f.Ehcache有一个后台线程专门做Ellment失效监测以及清除工作。设置线程运行间隔时间,可通过设置diskExpiryThreadIntervalSeconds属性来完成,此值不宜设置过低,否则会导致清理线程占用大量CPU资源。默认值是120秒。
-->
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">


    <diskStore path="java.io.tmpdir" />

    <defaultCache maxEntriesLocalHeap="10000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30"
        maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap" />
    </defaultCache>

    <cache name="sampleCache1" maxEntriesLocalHeap="10000"
        maxEntriesLocalDisk="1000" eternal="false" diskSpoolBufferSizeMB="20"
        timeToIdleSeconds="300" timeToLiveSeconds="600"
        memoryStoreEvictionPolicy="LFU" transactionalMode="off">
        <persistence strategy="localTempSwap" />
    </cache>

    <cache name="sampleCache2" maxEntriesLocalHeap="1000" eternal="true"
        memoryStoreEvictionPolicy="FIFO" />

</ehcache>

 
三、示例代码

package com.cn.fangxin.ehcache.test;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import org.junit.*;

public class TestEhcache {
	
	@Test
	public void testEhcachae() throws InterruptedException {
		CacheManager manager = CacheManager.create();

        // 取出所有的cacheName
        String names[] = manager.getCacheNames();
        System.out.println("----all cache names----");
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }

        System.out.println("----------------------");
        // 得到一个cache对象
        Cache cache1 = manager.getCache(names[0]);

        // 向cache1对象里添加缓存
        cache1.put(new Element("key1", "values1"));
        Element element = cache1.get("key1");

        // 读取缓存
        System.out.println("key1 \t= " + element.getObjectValue());

        // 手动创建一个cache(ehcache里必须有defaultCache存在,"test"可以换成任何值)
        Cache cache2 = new Cache("test", 1, true, false, 2, 3);
        manager.addCache(cache2);

        cache2.put(new Element("jimmy", "菩提树下的杨过"));

        // 故意停1.5秒,以验证是否过期
        Thread.sleep(1500);

        Element eleJimmy = cache2.get("jimmy");

        //1.5s < 2s 不会过期
        if (eleJimmy != null) {
            System.out.println("jimmy \t= " + eleJimmy.getObjectValue());
        }

        //再等上0.5s, 总时长:1.5 + 0.5 >= min(2,3),过期
        Thread.sleep(500);

        eleJimmy = cache2.get("jimmy");

        if (eleJimmy != null) {
            System.out.println("jimmy \t= " + eleJimmy.getObjectValue());
        }

        // 取出一个不存在的缓存项
        System.out.println("fake \t= " + cache2.get("fake"));

        manager.shutdown();
	}

}

 运行结果:

----all cache names----
sampleCache2
sampleCache1
----------------------
key1     = values1
jimmy     = 菩提树下的杨过
fake     = null

 

四、关于timeToLiveSeconds、timeToIdleSeconds

这二个参数直接影响缓存项的过期时间,看文档说明基本上没啥用,直接看net.sf.ehcache.Element源码的片段:

/**
     * The amount of time for the element to live, in seconds. 0 indicates unlimited.
     */
    private volatile int timeToLive = Integer.MIN_VALUE;

    /**
     * The amount of time for the element to idle, in seconds. 0 indicates unlimited.
     */
    private volatile int timeToIdle = Integer.MIN_VALUE;
    
    
    /**
     * Sets time to Live
     * <P/>
     * Value must be a positive integer, 0 means infinite time to live.
     * <P/>
     * If calling this method with 0 as the parameter, consider using {@link #setEternal(boolean)}
     * or make sure you also explicitly call {@link #setTimeToIdle(int)}.
     *
     * @param timeToLiveSeconds the number of seconds to live
     */
    public void setTimeToLive(final int timeToLiveSeconds) {
        if (timeToLiveSeconds < 0) {
            throw new IllegalArgumentException("timeToLive can't be negative");
        }
        this.cacheDefaultLifespan = false;
        this.timeToLive = timeToLiveSeconds;
    }

    /**
     * Sets time to idle
     * <P/>
     * Value must be a positive integer, 0 means infinite time to idle.
     * <P/>
     * If calling this method with 0 as the parameter, consider using {@link #setEternal(boolean)}
     * or make sure you also explicitly call {@link #setTimeToLive(int)}.
     *
     * @param timeToIdleSeconds the number of seconds to idle
     */
    public void setTimeToIdle(final int timeToIdleSeconds) {
        if (timeToIdleSeconds < 0) {
            throw new IllegalArgumentException("timeToIdle can't be negative");
        }
        this.cacheDefaultLifespan = false;
        this.timeToIdle = timeToIdleSeconds;
    }
    
    

    /**
     * An element is expired if the expiration time as given by {@link #getExpirationTime()} is in the past.
     *
     * @return true if the Element is expired, otherwise false. If no lifespan has been set for the Element it is
     *         considered not able to expire.
     * @see #getExpirationTime()
     */
    public boolean isExpired() {
        if (!isLifespanSet() || isEternal()) {
            return false;
        }

        long now = System.currentTimeMillis();
        long expirationTime = getExpirationTime();

        return now > expirationTime;
    }
    
    
    /**
     * An element is expired if the expiration time as given by {@link #getExpirationTime()} is in the past.
     * <p>
     * This method in addition propogates the default TTI/TTL values of the supplied cache into this element.
     *
     * @param config config to take default parameters from
     * @return true if the Element is expired, otherwise false. If no lifespan has been set for the Element it is
     *         considered not able to expire.
     * @see #getExpirationTime()
     */
    public boolean isExpired(CacheConfiguration config) {
        if (cacheDefaultLifespan) {
            if (config.isEternal()) {
                timeToIdle = 0;
                timeToLive = 0;
            } else {
                timeToIdle = TimeUtil.convertTimeToInt(config.getTimeToIdleSeconds());
                timeToLive = TimeUtil.convertTimeToInt(config.getTimeToLiveSeconds());
            }
        }
        return isExpired();
    }

    /**
     * Returns the expiration time based on time to live. If this element also has a time to idle setting, the expiry
     * time will vary depending on whether the element is accessed.
     *
     * @return the time to expiration
     */
    public long getExpirationTime() {
        if (!isLifespanSet() || isEternal()) {
            return Long.MAX_VALUE;
        }

        long expirationTime = 0;
        long ttlExpiry = creationTime + TimeUtil.toMillis(getTimeToLive());

        long mostRecentTime = Math.max(creationTime, lastAccessTime);
        long ttiExpiry = mostRecentTime + TimeUtil.toMillis(getTimeToIdle());

        if (getTimeToLive() != 0 && (getTimeToIdle() == 0 || lastAccessTime == 0)) {
            expirationTime = ttlExpiry;
        } else if (getTimeToLive() == 0) {
            expirationTime = ttiExpiry;
        } else {
            expirationTime = Math.min(ttlExpiry, ttiExpiry);
        }
        return expirationTime;
    }

    /**
     * @return true if the element is eternal
     */
    public boolean isEternal() {
        return (0 == timeToIdle) && (0 == timeToLive);
    }
    
    
    /**
     * Sets whether the element is eternal.
     *
     * @param eternal
     */
    public void setEternal(final boolean eternal) {
        if (eternal) {
            this.cacheDefaultLifespan = false;
            this.timeToIdle = 0;
            this.timeToLive = 0;
        } else if (isEternal()) {
            this.cacheDefaultLifespan = false;
            this.timeToIdle = Integer.MIN_VALUE;
            this.timeToLive = Integer.MIN_VALUE;
        }
    }

    /**
     * Whether any combination of eternal, TTL or TTI has been set.
     *
     * @return true if set.
     */
    public boolean isLifespanSet() {
        return this.timeToIdle != Integer.MIN_VALUE || this.timeToLive != Integer.MIN_VALUE;
    }

    /**
     * @return the time to live, in seconds
     */
    public int getTimeToLive() {
        if (Integer.MIN_VALUE == timeToLive) {
            return 0;
        } else {
            return timeToLive;
        }
    }

    /**
     * @return the time to idle, in seconds
     */
    public int getTimeToIdle() {
        if (Integer.MIN_VALUE == timeToIdle) {
            return 0;
        } else {
            return timeToIdle;
        }
    }
    
    
    /**
     * Set the default parameters of this element - those from its enclosing cache.
     * @param tti TTI in seconds
     * @param ttl TTL in seconds
     * @param eternal <code>true</code> if the element is eternal.
     */
    protected void setLifespanDefaults(int tti, int ttl, boolean eternal) {
        if (eternal) {
            this.timeToIdle = 0;
            this.timeToLive = 0;
        } else if (isEternal()) {
            this.timeToIdle = Integer.MIN_VALUE;
            this.timeToLive = Integer.MIN_VALUE;
        } else {
            timeToIdle = tti;
            timeToLive = ttl;
        }
    }

 

 

结论:

a) timeToIdleSeconds(空闲时间)、timeToLiveSeconds(生存时间)都设置为0时,表示不过期

b) 如果只有timeToLiveSeconds设置>0的值,则Element的过期时间为 timeToLiveSeconds

c) 如果只有timeToIdleSeconds设置>0的值,则Element的过期时间为 (上次访问时间+timeToIdleSeconds),说得更通俗点,上次get过了,现在又想get,若二次get的时间间隔>timeToIdleSeconds,则过期(即:最后一次get出来为null)

d) 如果timeToLiveSeconds、timeToIdleSeconds都有>0的值,则最终过期时间为 b),c)规则综合起来,取二者的最小值


测试1:

@Test
    public void testTimeToIdleSeconds() throws InterruptedException {
        CacheManager manager = CacheManager.create();

        Cache myCache = new Cache("MyCache", 1, true, false, 0, 0); // Cache上设置为永不过期
        manager.addCache(myCache);

        String key = "A";

        System.out.println("-------------------------");
        Element elementPut = new Element(key, "Some Value", 2, 0); // timeToIdleSeconds为2秒

        myCache.put(elementPut);// 放入缓存
        System.out.println(myCache.get(key));// 取出显示

        Thread.sleep(1500);// 停1.5秒
        System.out.println(myCache.get(key));// 再次取出

        Thread.sleep(1500);// 停1.5秒
        System.out.println(myCache.get(key));// 虽然总时间已达3秒,但刚刚被访问过了,所以又可以再"活"2秒,仍然有效

        Thread.sleep(2500);// 停2.5秒
        System.out.println(myCache.get(key));// 距离上次访问已过2.5s,已经>2s,过期

    }

 

输出结果

[ key = A, value=Some Value, version=1, hitCount=1, CreationTime = 1407898361782, LastAccessTime = 1407898361787 ]
[ key = A, value=Some Value, version=1, hitCount=2, CreationTime = 1407898361782, LastAccessTime = 1407898363287 ]
[ key = A, value=Some Value, version=1, hitCount=3, CreationTime = 1407898361782, LastAccessTime = 1407898364787 ]
null

 

测试2:

@Test
    public void testTimeToLiveSeconds() throws InterruptedException {
        CacheManager manager = CacheManager.create();

        Cache myCache = new Cache("MyCache", 1, true, false, 0, 0); // Cache上设置为永不过期
        manager.addCache(myCache);

        String key = "A";

        System.out.println("-------------------------");
        Element elementPut = new Element(key, "Some Value", 0, 2); // timeToLiveSeconds为2秒

        myCache.put(elementPut);// 放入缓存
        System.out.println(myCache.get(key));// 取出显示

        Thread.sleep(1500);// 停1.5秒
        System.out.println(myCache.get(key));// 再次取出(1.5s<2s,还"活"着)

        Thread.sleep(1500);// 停1.5秒
        System.out.println(myCache.get(key));// 总时间已达3s,>2s,已过期)

    }

 

输出结果

[ key = A, value=Some Value, version=1, hitCount=1, CreationTime = 1407898423291, LastAccessTime = 1407898423296 ]
[ key = A, value=Some Value, version=1, hitCount=2, CreationTime = 1407898423291, LastAccessTime = 1407898424797 ]
null

 

测试3:

@Test
    public void testTimeToIdleSecondsAndTimeToLiveSeconds()
            throws InterruptedException {
        CacheManager manager = CacheManager.create();

        Cache myCache = new Cache("MyCache", 1, true, false, 0, 0); // Cache上设置为永不过期
        manager.addCache(myCache);

        String key = "A";

        System.out.println("-------------------------");
        Element elementPut = new Element(key, "Some Value", 2, 5); // timeToIdleSeconds为2秒,timeToLiveSeconds为3秒

        myCache.put(elementPut);// 放入缓存
        System.out.println(myCache.get(key));// 取出显示

        Thread.sleep(1600);// 停1.6秒
        System.out.println(myCache.get(key));// 再次取出(1.6s < min(2 ,5),还"活"着)

        Thread.sleep(1600);// 停1.6秒
        System.out.println(myCache.get(key));// 总时间已达3.2s,< min((1.6+2) ,5),还"活"着)
        
        Thread.sleep(1600);// 停1.6秒
        System.out.println(myCache.get(key));// 总时间已达4.8s,< min((3.2+2) ,5),还"活"着)
        
        Thread.sleep(500);// 停0.5秒
        System.out.println(myCache.get(key));// 总时间已达4.8+0.5=5.3s,> min((4.8+2) ,5),过期)

    }

 

输出结果

[ key = A, value=Some Value, version=1, hitCount=1, CreationTime = 1407898480892, LastAccessTime = 1407898480897 ]
[ key = A, value=Some Value, version=1, hitCount=2, CreationTime = 1407898480892, LastAccessTime = 1407898482499 ]
[ key = A, value=Some Value, version=1, hitCount=3, CreationTime = 1407898480892, LastAccessTime = 1407898484099 ]
[ key = A, value=Some Value, version=1, hitCount=4, CreationTime = 1407898480892, LastAccessTime = 1407898485699 ]
null

关于这二个参数的设置,个人建议是:

a) 如果缓存的数据本身不存在更新(比如:一些几乎从来不动的基础数据),只设置timeToIdleSeconds,这样的好处是,如果缓存项一直有人在访问,就永远不会过期,反之,如果没人用,空闲一段时间后,会自动过期,释放资源

b) 如果缓存的数据本身存在定期的更新问题(比如:天气预报之类每隔几小时,db中会更新的数据),可同时设置二个参数,timeToLiveSeconds的值应该要小于db中的更新周期,这样db中的数据变化后,过一段时间就会更新到缓存中

 

四、在spring中集成ehcache

1、需要添加的依赖

<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>3.0.5.RELEASE</version>
		</dependency>

 2、在spring中的配置

<bean id="ehcacheCacheManager"
		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation">
			<value>classpath:ehcache.xml</value>
		</property>
	</bean>

 

 

出处:http://yjmyzz.cnblogs.com 

分享到:
评论

相关推荐

    ehcache-2.8.3

    下面将详细介绍Ehcache的核心概念、主要功能以及如何在实际应用中使用它。 1. **核心概念** - **缓存**:缓存是存储在内存中的临时数据集,用于快速响应后续请求。Ehcache将经常访问的数据存储在内存中,以便快速...

    Ehcache(一): Spring + Ehcache开场白

    总的来说,Spring与Ehcache的结合使用,使得开发人员可以方便快捷地在应用中实现高效的缓存管理。通过合理的配置和使用,可以大大提高系统的响应速度,降低数据库的负载,同时还能提供良好的可扩展性和维护性。

    Ehcache(2): Ehcache实例在Eclipse中的配置 改进

    综上所述,Ehcache在Eclipse中的配置涉及到对Hibernate的设置、Ehcache配置文件的编写以及缓存策略的调整。理解这些知识点有助于我们在Java开发中更高效地利用缓存技术,提升系统的响应速度和整体性能。

    spring+ehcache示例整合Demo

    在这个"spring+ehcache示例整合Demo"中,我们将会探讨如何将Ehcache集成到Spring框架中,以实现高效的缓存管理。 首先,我们需要在项目的`pom.xml`文件中引入Ehcache和Spring的依赖。Ehcache通常使用的是`org....

    ehcache 2.8.3 API

    ehcache 2.8.3 API EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开 源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它...

    Spring与ehcache结合使用

    本文将详细介绍如何在Spring框架中集成ehcache来实现本地缓存,从而提升应用的整体性能。 #### 二、ehcache简介 ehcache是一款开源的高性能Java本地缓存系统,它可以极大地减少数据库的访问次数,提高应用程序的...

    Ehcache集成Spring的使用(转载)

    这篇博客将深入探讨如何将 Ehcache 集成到 Spring 应用中,以及如何使用 Spring AOP 实现计算结果的缓存。 首先,集成 Ehcache 到 Spring 需要以下步骤: 1. **引入依赖**: 在 Maven 或 Gradle 的配置文件中添加 ...

    spring+ehcache完整示例demo

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而Ehcache则是一种广泛使用的内存缓存系统,常与Spring搭配用于提升应用性能。本示例旨在通过一个完整的Spring集成Ehcache的Demo,帮助开发者理解如何...

    Ehcache分布式缓存与其在spring中的使用

    ### Ehcache分布式缓存及其在Spring中的应用 #### 一、Ehcache概述与原理 Ehcache是一款高效且轻量级的纯Java缓存框架,由于其出色的性能和易于集成的特点,在Java开发中有着广泛的应用。作为Hibernate的默认缓存...

    Ehcache整合Spring使用页面、对象缓存

    在Spring框架中整合Ehcache,可以实现页面和对象级别的缓存管理,从而优化Web应用的响应速度。下面将详细介绍Ehcache与Spring的整合及其在页面和对象缓存中的应用。 一、Ehcache简介 Ehcache是基于内存的分布式缓存...

    spring+ehcache demo

    本示例"spring+ehcache demo"将带你深入理解如何在Spring环境中集成并使用Ehcache进行数据缓存。 Ehcache是一款广泛使用的开源Java缓存库,它提供了内存和磁盘存储,支持分布式缓存,并且可以与Spring框架无缝结合...

    Spring 使用注解配置使用ehcache

    本文将深入探讨如何在Spring中使用注解来配置Ehcache。 首先,我们需要在项目中引入Ehcache的相关依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;net.sf.ehcache&lt;/groupId&gt; ...

    ehcache+spring demo 整合

    将 Ehcache 整合到 Spring 中,可以方便地在Spring应用中使用缓存服务。 在"ehcache+spring demo 整合"项目中,我们有两个工程:一个Web工程和一个Java工程。Web工程通常用于构建前端展示和处理HTTP请求,而Java...

    springboot HelloWorld

    SpringBoot HelloWorld 是一个初学者经常会遇到的示例项目,它旨在帮助开发者快速了解并开始使用Spring Boot框架。Spring Boot是由Pivotal团队提供的全新框架,其设计目标是简化新Spring应用的初始搭建以及开发过程...

    在Spring+Hibernate集成环境中使用EhCache缓存

    在Spring和Hibernate集成的开发环境中,使用EhCache作为缓存机制是常见的优化策略,它能够显著提升应用程序的性能和响应速度。EhCache是一款开源的、高性能的、内存级的分布式缓存解决方案,适用于Java应用程序。...

    Ehcache 整合Spring 使用页面、对象缓存

    ### Ehcache 整合Spring 使用页面、对象缓存 #### 一、Ehcache简介与特点 Ehcache是一款开源的、高性能的Java缓存框架,它可以用来存储、检索短期数据,以减轻数据库的压力,提高应用程序性能。Ehcache不仅支持...

    开源测试项目:spring mvc+springsecurity3+ehcache+bootstrap+mysql

    开源测试项目:spring mvc+springsecurity3+ehcache+bootstrap+mysql 内附MySQL表,直接导入就可运行 效果图请移步:http://blog.csdn.net/yangxuan0261/article/details/10053947

    Spring+Ehcache集成

    本篇文章将详细介绍如何在Spring项目中集成Ehcache,以及如何通过Spring的AOP(面向切面编程)实现方法级别的缓存注解。 首先,我们需要在项目中引入Ehcache的依赖。通常,这可以通过在`pom.xml`文件中添加Maven...

    Spring Boot 2.x基础教程:使用EhCache缓存集群.docx

    在Spring Boot 2.x应用程序中,EhCache是一种常用的缓存解决方案,用于提高应用程序性能,减少对数据库的访问。然而,当我们的应用被部署在分布式环境中,即多个进程同时运行时,缓存的一致性问题变得至关重要。为了...

    spring2.5整合ehcache2.0使用

    在本文中,我们将深入探讨如何将Spring 2.5与Ehcache 2.0进行集成...在EhCacheDemo项目中,你将找到一个完整的示例,包括所有必要的配置文件、Java代码和测试用例,这将帮助你更好地理解和实践Spring与Ehcache的集成。

Global site tag (gtag.js) - Google Analytics