Ehcache缓存入门实战(附源码)

                       

Ehcache缓存入门实战(附源码)

Ehcache是一个强大、成熟的Java缓存框架,可以非常容易与其他库和框架集成。官网声称Ehcache可以作为TB级别的数据缓存,并且具有高扩展性。目前Ehcache的最新版本是3.1。

本文不会深究缓存背后的原理,只是作为一个使用Ehcache的例子,由于最近需要做一个类似二级缓存的功能,特地学习了下Ehcache。发现Ehcache作为一个本地缓存框架使用还是非常合适的,但是如果扩展到分布式缓存就需要考虑使用Redis这样的分布式缓存框架了。

为了快速入门,这里使用配置文件的方式整合Ehcache。

创建Maven工程,添加pom.xml依赖如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.rhwayfun</groupId>    <artifactId>ehcache-demo</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>ehcache-demo</name>    <description>ehcache-demo</description>    <properties>        <!-- 项目编码 -->        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <!-- junit版本号 -->        <junit.version>4.12</junit.version>        <!-- spring版本号 -->        <spring.version>3.2.8.RELEASE</spring.version>    </properties>    <dependencies>        <!-- 添加单元测试依赖 -->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>${junit.version}</version>        </dependency>        <!-- 添加Spring依赖 -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aop</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aspects</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-tx</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jdbc</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-web</artifactId>            <version>${spring.version}</version>        </dependency>        <!--spring单元测试依赖 -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-test</artifactId>            <version>${spring.version}</version>            <scope>test</scope>        </dependency>        <!-- ehcache 相关依赖 -->        <dependency>            <groupId>net.sf.ehcache</groupId>            <artifactId>ehcache</artifactId>            <version>2.8.2</version>        </dependency>    </dependencies></project>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89

添加Spring配置:application.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:cache="http://www.springframework.org/schema/cache"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:aop="http://www.springframework.org/schema/aop"    xsi:schemaLocation="             http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd             http://www.springframework.org/schema/aop             http://www.springframework.org/schema/aop/spring-aop-3.0.xsd           http://www.springframework.org/schema/context             http://www.springframework.org/schema/context/spring-context-3.0.xsd           http://www.springframework.org/schema/cache            http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">    <!-- 自动扫描注解的bean -->    <context:component-scan base-package="com.rhwayfun.ehcache.service.impl" />    <cache:annotation-driven cache-manager="cacheManager" />    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">          <property name="cacheManager" ref="ehcache"></property>      </bean>    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">          <property name="configLocation" value="classpath:ehcache.xml"></property>      </bean></beans>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

还需要Ehcache的配置文件:ehcache.xml

<?xml version="1.0" encoding="UTF-8"?><ehcache>    <!-- 指定一个文件目录,当EhCache把数据写到硬盘上时,将把数据写到这个文件目录下 -->    <diskStore path="java.io.tmpdir"/>    <!-- 设定缓存的默认数据过期策略 -->    <!--         参数说明:        name:缓存名称        maxElementsInMemory:内存中最大的缓存对象数        eternal:true表示对象永不过期        overflowToDisk:true表示当内存缓存的对象数达到maxElementsInMemory后,会把溢出的对象写到硬盘缓存中。(ps:如果需要写到磁盘中,则写入的对象必须实现Serializable接口)        timeToIdleSeconds:设定允许对象处于空闲状态的最长时间,以秒为单位。(ps:这个属性只有当eternal属性为false才有效)        timeToLiveSeconds:设定对象允许存在于缓存中的最大生存时间,以秒为单位。(ps:这个属性只有当eternal属性为false才有效)        diskPersistent:是否缓存虚拟机重启期数据,是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,        后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程        序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法。        diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒     -->    <defaultCache            maxElementsInMemory="10000"             eternal="false"             overflowToDisk="true"            timeToIdleSeconds="10"            timeToLiveSeconds="20"            diskPersistent="false"            diskExpiryThreadIntervalSeconds="120"/>    <cache name="cacheTest"        maxElementsInMemory="1000"        eternal="false"        overflowToDisk="true"        timeToIdleSeconds="10"        timeToLiveSeconds="20"/></ehcache>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

在代码中已经对具体的参数含义做了说明,这里不再赘述。这里要注意的是name属性,在后面的测试代码需要使用到它。

编写测试接口:

package com.rhwayfun.ehcache.service;/** *  * @ClassName: EhcacheService  * @Description: TODO * @author ZhongCB * @date 2016年8月11日 上午11:53:52  * */public interface EhcacheService {    String getTime(String param);}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

接口实现类:

package com.rhwayfun.ehcache.service.impl;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import com.rhwayfun.ehcache.service.EhcacheService;@Servicepublic class EhcacheServiceImpl implements EhcacheService {    @Cacheable(value = "cacheTest", key="#param")    public String getTime(String param) {        return String.valueOf(System.currentTimeMillis());    }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

注意@Cacheable注解的value属性的值就是ehcache.xml配置文件中的name属性的值。key表示方法的参数param代表的就是缓存的key,通过这个key可以获取到value。

最后编写测试代码:

package com.rhwayfun.test;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.rhwayfun.ehcache.service.EhcacheService;@ContextConfiguration(locations = {"classpath:application.xml"})@RunWith(SpringJUnit4ClassRunner.class)public class EhcacheTest extends AbstractJUnit4SpringContextTests{    @Autowired    private EhcacheService ehcacheService;    @Test    public void testEhcache() throws InterruptedException{        System.out.println("第一次调用:" + ehcacheService.getTime("param"));        Thread.sleep(2000);        System.out.println("第二次调用(2秒后):" + ehcacheService.getTime("param"));        Thread.sleep(10000);        System.out.println("第三次调用(10秒后):" + ehcacheService.getTime("param"));    }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行该测试类,结果如下:

测试结果

至此,Ehcache的入门实战就结束了,如果想要更详细了解Ehcache的资料,请访问Ehcache官网

附:Ehcache入门实战源码

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43667968/article/details/86644851
今日推荐