Echache整合Spring缓存实例讲解

Wesley13
• 阅读 476

摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例。

一、EhCache 介绍

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

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

二、使用实例

本文要使用

1、引入jar包

[html]  view plain copy

  1. <dependency>
  2. <groupId>net.sf.ehcache</groupId>
  3. <artifactId>ehcache</artifactId>
  4. <version>2.8.2</version>
  5. </dependency>

2、在classpath下增加ehcache配置文件 ehcache.xml与配置文件

Echache整合Spring缓存实例讲解

设置控制ehcache的bean,这部分的内容也可以直接写在spring的配置文件applicationContext.xml中去,这里为了方便管理,我给单独写出来了

beans-cache.xml

[html]  view plain copy

  1. <beans xmlns="http://www.springframework.org/schema/beans"

  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache"

  3. xmlns:p="http://www.springframework.org/schema/p"

  4. xsi:schemaLocation="

  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

  6. http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd"\>

  7. <cache:annotation-driven cache-manager="cacheManager" />

  8. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">

  9. <property name="cacheManager" ref="ehcache"></property>

  10. </bean>

  11. <bean id="ehcache"

  12. class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">

  13. <property name="configLocation" value="classpath:beans/ehcache.xml"></property>

  14. </bean>

  15. </beans>

ehcache.xml设置缓存大小和时间,缓存空间名等。其中缓存空间可设置多个

[html]  view plain copy

  1. <ehcache updateCheck="false">

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

  3. <defaultCache eternal="false"

  4. overflowToDisk="false"

  5. diskPersistent="false"

  6. timeToLiveSeconds="36000"

  7. timeToIdleSeconds="36000"

  8. maxElementsInMemory="10000"

  9. memoryStoreEvictionPolicy="LRU"/>

  10. <cache name="sysParamCache"

  11. overflowToDisk="false"

  12. eternal="false"

  13. diskPersistent="false"

  14. timeToLiveSeconds="36000"

  15. timeToIdleSeconds="36000"

  16. maxElementsInMemory="10000"

  17. memoryStoreEvictionPolicy="LRU"/>

  18. </ehcache>

参数说明:

当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口)。

用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index。
name:

缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)。
maxElementsOnDisk:

磁盘缓存中最多可以存放的元素数量,0表示无穷大。
maxElementsInMemory:

内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况。
1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中。
2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素。
Eternal:

缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds。
timeToIdleSeconds:

缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除。
timeToLiveSeconds:

缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大,即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除。
overflowToDisk:

内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中),会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data。

diskPersistent:

是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件,这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存,要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法。
diskExpiryThreadIntervalSeconds:

磁盘缓存的清理线程运行间隔,默认是120秒。
diskSpoolBufferSizeMB:

设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB
memoryStoreEvictionPolicy:

内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存,共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)。

3.spring配置文件 applicationContext.xml 添加ehcache的配置

[plain]  view plain copy

4.在service层增加注解配置

[java]  view plain copy

  1. @Override
  2. @Cacheable(value="sysParamCache",key="#systemId+#merchantId+#businessType")// 使用了一个缓存名叫 accountCache
  3. public SettUnit getSettUnitBySettUnitId(String systemId, String merchantId, String businessType) {

key=#systemId+#merchantId+#businessType" 对象缓存的key值,需要保证唯一, 用的是Spring的 SpEL表达式, 取值为 isbn对象的id属性值

value="sysParamCache":指的是ehcache.xml里的缓存名字

5、单元测试

[java]  view plain copy

  1. @Test

  2. public void getSettUnitBySettUnitIdTest() {

  3. String systemId = "CES";

  4. String merchantId = "133";

  5. SettUnit configSettUnit = settUnitService.getSettUnitBySettUnitId(systemId, merchantId, "ESP");

  6. SettUnit configSettUnit1 = settUnitService.getSettUnitBySettUnitId(systemId, merchantId, "ESP");

  7. boolean flag= (configSettUnit == configSettUnit1);

  8. System.out.println(configSettUnit);

  9. logger.info("查找结果" + configSettUnit.getBusinessType());

  10. //  localSecondFIFOCache.put("configSettUnit", configSettUnit.getBusinessType());

  11. //  String string = localSecondFIFOCache.get("configSettUnit");

  12. logger.info("查找结果" + string);

  13. }

这是有缓存的结果,第二次直接从缓存中去取,比较两个的地址,相等即表明两上是同一个对象,第二次取的是第一次的结果

Echache整合Spring缓存实例讲解

这是第一次取结果打印的SQL语句

Echache整合Spring缓存实例讲解

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
J2Cache 没有 Redis 也可以实现多节点的缓存同步
J2Cache是一个两级的缓存框架,第一级是基于内存的数据缓存,支持caffeine、ehcache2和ehcache3,二级缓存只支持redis。在某些生产环境中你可能没有redis,但是又希望多个应用节点间的缓存数据是同步的。配置的方法很简单:1\.首先关闭二级缓存(使用none替代redis)j2cache
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这