spring-boot整合ehcache实现缓存机制的方法

作者:大招无限 时间:2023-06-18 20:05:10 

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题。

spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的不同。

1.spring-boot是一个通过maven管理的jar包的框架,集成ehcache需要的依赖如下


<dependency>
<groupId>org.springframework</groupId>
 <artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
  <groupId>net.sf.ehcache</groupId>
 <artifactId>ehcache</artifactId>
  <version>2.8.3</version>
</dependency>

具体pom.xml文件如下


<?xml version="1.0" encoding="UTF-8"?>
<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.lclc.boot</groupId>
<artifactId>boot-cache</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- Inherit defaults from Spring Boot -->
<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.1.3.RELEASE</version>
</parent>
<dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>
 <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
 </dependency>
 <dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>17.0</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
 </dependency>
 <dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.8.3</version>
 </dependency>
</dependencies>
<dependencyManagement>
 <dependencies>
 </dependencies>
</dependencyManagement>
<build>
 <plugins>
  <plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
  </plugin>
 </plugins>
</build>
<repositories>
 <repository>
  <id>spring-snapshots</id>
  <url>http://repo.spring.io/snapshot</url>
  <snapshots>
   <enabled>true</enabled>
  </snapshots>
 </repository>
 <repository>
  <id>spring-milestones</id>
  <url>http://repo.spring.io/milestone</url>
 </repository>
</repositories>
<pluginRepositories>
 <pluginRepository>
  <id>spring-snapshots</id>
  <url>http://repo.spring.io/snapshot</url>
 </pluginRepository>
 <pluginRepository>
  <id>spring-milestones</id>
  <url>http://repo.spring.io/milestone</url>
 </pluginRepository>
</pluginRepositories>
</project>

2.使用ehcache,我们需要一个ehcache.xml来定义一些cache的属性。


<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
  <diskStore path="java.io.tmpdir/Tmp_EhCache" />
  <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" />
  <cache name="demo" eternal="false" maxElementsInMemory="100" overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU" />
</ehcache>

解释下这个xml文件中的标签。

(1).diskStore: 为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:

user.home – 用户主目录
user.dir – 用户当前工作目录
java.io.tmpdir – 默认临时文件路径

(2).defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。

(3).cache:自定缓存策略,为自定义的缓存策略。参数解释如下:

cache元素的属性:

name:缓存名称
maxElementsInMemory:内存中最大缓存对象数
maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大
eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false
overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。
diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。
diskPersistent:是否缓存虚拟机重启期数据
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒
timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态
timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。

3.将ehcache的管理器暴露给spring的上下文容器,


@Configuration
// 标注启动了缓存
@EnableCaching
public class CacheConfiguration {
/*
 * ehcache 主要的管理器
 */
@Bean(name = "appEhCacheCacheManager")
public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){
 return new EhCacheCacheManager (bean.getObject ());
}

/*
 * 据shared与否的设置,Spring分别通过CacheManager.create()或new CacheManager()方式来创建一个ehcache基地.
 */
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
 EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();
 cacheManagerFactoryBean.setConfigLocation (new ClassPathResource ("conf/ehcache-app.xml"));
 cacheManagerFactoryBean.setShared (true);
 return cacheManagerFactoryBean;
}
}

@Configuration:为spring-boot注解,主要标注此为配置类,优先扫描。

@Bean:向spring容器中加入bean。

至此所有的配置都做好了,通过spring-boot进行集成框架就是这么简单。

4.使用ehcache

使用ehcache主要通过spring的缓存机制,上面我们将spring的缓存机制使用了ehcache进行实现,所以使用方面就完全使用spring缓存机制就行了。
具体牵扯到几个注解:

@Cacheable:负责将方法的返回值加入到缓存中,参数3
@CacheEvict:负责清除缓存,参数4

参数解释:

value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name
key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL
condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

allEntries:CacheEvict参数,true表示清除value中的全部缓存,默认为false

不多说,直接上代码:


@Service
public class CacheDemoServiceImpl implements CacheDemoService {
/**
 * 缓存的key
 */
public static final String THING_ALL_KEY = "\"thing_all\"";
/**
 * value属性表示使用哪个缓存策略,缓存策略在ehcache.xml
 */
public static final String DEMO_CACHE_NAME = "demo";
@CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
@Override
public void create(Thing thing){
 Long id = getNextId ();
 thing.setId (id);
 data.put (id, thing);
}
 @Cacheable(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'")
@Override
public Thing findById(Long id){
 System.err.println ("没有走缓存!" + id);
 return data.get (id);
}
 @Cacheable(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
@Override
public List<Thing> findAll(){
 return Lists.newArrayList (data.values ());
}
 @Override
@CachePut(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'")
@CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
public Thing update(Thing thing){
 System.out.println (thing);
 data.put (thing.getId (), thing);
 return thing;
}
@CacheEvict(value = DEMO_CACHE_NAME)
@Override
public void delete(Long id){
 data.remove (id);
}
}

5.只需要通过注解在service层方法上打注解便可以使用缓存,在find**上存入缓存,在delete**,update**上清除缓存。

总结

以上所述是小编给大家介绍的spring-boot整合ehcache实现缓存机制的方法网站的支持!

来源:https://www.cnblogs.com/lic309/p/4072848.html

标签:spring,boot,ehcache,缓存
0
投稿

猜你喜欢

  • C#中datagridview使用tooltip控件显示单元格内容的方法

    2022-04-15 12:23:23
  • Java基础知识精通块作用域与条件及switch语句

    2022-12-21 17:50:07
  • 解答为什么 Java 线程没有Running状态

    2021-08-25 13:10:33
  • Java实现删除排序数组中重复元素的方法小结【三种方法比较】

    2023-09-28 15:21:48
  • Java java.lang.ExceptionInInitializerError 错误如何解决

    2021-06-11 10:46:24
  • C#网站生成静态页面的实例讲解

    2021-11-01 16:33:08
  • Android开发之获取LayoutInflater对象的方法总结

    2023-05-29 21:50:28
  • C#基于NPOI生成具有精确列宽行高的Excel文件的方法

    2022-12-18 13:32:46
  • Spring Security使用中Preflight请求和跨域问题详解

    2021-06-12 11:04:15
  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    2023-07-05 06:54:14
  • Java性能优化技巧汇总

    2023-01-05 16:26:31
  • sort page 排序和分页的小例子

    2022-07-31 23:08:37
  • java排序算法之冒泡排序

    2023-04-05 21:03:42
  • Unity3D实现旋钮控制灯光效果

    2021-09-05 21:16:58
  • C#实现自由组合本地缓存、分布式缓存和数据查询

    2021-06-13 00:56:11
  • C#使用第三方组件实现动态解析和求值字符串表达式

    2023-12-27 09:06:50
  • Mybatis关于动态排序 #{} ${}问题

    2023-09-01 17:34:57
  • MybatisPlus中@TableField注解的使用详解

    2021-11-01 23:05:35
  • Java将json对象转换为map键值对案例详解

    2023-11-28 07:38:43
  • Android性能优化之Bitmap图片优化详解

    2023-08-06 02:54:23
  • asp之家 软件编程 m.aspxhome.com