热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot整合EhCache的步骤详解

本文讲解SpringBoot与EhCache的整合。1EhCache简介EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。

本文讲解Spring Boot与EhCache的整合。

1 EhCache简介

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

2 Spring Boot整合EhCache步骤 2.1 创建项目,导入依赖

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

 4.0.0
 com.yiidian
 ch03_10_springboot_ehcache
 1.0-SNAPSHOT
 
 
 
  org.springframework.boot
  spring-boot-starter-parent
  2.1.11.RELEASE
 
 
  
  
   org.springframework.boot
   spring-boot-starter-web
  
  
  
   org.springframework.boot
   spring-boot-starter-test
   2.1.6.RELEASE
   test
  
  
  
  
   org.springframework.boot
   spring-boot-starter-cache
   2.1.11.RELEASE
  
  
  
   net.sf.ehcache
   ehcache
   2.10.6
  

 

2.2 配置ehcache.xml

在resources目录下建立ehcache.xml,内容如下:


 
 
 
  
 
 
 
  
 

参数说明

  • name 缓存名称
  • maxElementsInMemory 缓存最大个数
  • eternal 对象是否永久有效,一但设置了,timeout将不起作用
  • timeToIdleSeconds 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大
  • timeToLiveSeconds 设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大
  • overflowToDisk 当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中
  • diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
  • maxElementsOnDisk 硬盘最大缓存个数
  • diskPersistent 是否缓存虚拟机重启期数据
  • diskExpiryThreadIntervalSeconds 磁盘失效线程运行时间间隔,默认是120秒。
  • memoryStoreEvictionPolicy 当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)
  • clearOnFlush 内存数量最大时是否清除

2.3 编写application.yml

#配置EhCache的配置
spring:
 cache:
 ehcache:
  config: ehcache.xml # 读取ehcache.xml配置

2.4 编写引导类

package com.yiidian;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
/**
 * Spring Boot引导类
 * 一点教程网 - www.yiidian.com
 */
@SpringBootApplication
@EnableCaching // 开启缓存
public class MyBootApplication {
 public static void main(String[] args) {
  SpringApplication.run(MyBootApplication.class,args);
 }
}

引导类中需要添加@EnableCaching注解,开启缓存功能

2.5 编写Service类

package com.yiidian.service;
import com.yiidian.domain.Customer;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
 * 业务层
 *一点教程网 - www.yiidian.com
 */
@Service
public class CustomerService {
  @Cacheable(value = "customer",key = "#id")
  public Customer findById(Integer id){
    System.out.println("执行了UserService获取User");
    Customer customer = new Customer();
    customer.setId(1);
    customer.setName("小明");
    customer.setGender("男");
    customer.setTelephone("13244445555");
    return customer;
  }
}

@Cacheable的属性:

  • value:对应ehcache.xml的缓存配置名称(name属性值)
  • key:给缓存值起个key,便于Spring内部检索不同的缓存数据。#id这个语法代表把方法形参作为key。

2.6 编写测试类

package com.yiidian.test;

import com.yiidian.MyBootApplication;
import com.yiidian.service.CustomerService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * SpringBoot整合EhCache
 * 一点教程网 - www.yiidian.com
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyBootApplication.class)
public class EhCacheDemo {
  @Autowired
  private CustomerService customerService;

  @Test
  public void test1(){
    //查询第一次
    System.out.println(customerService.findById(1));
    //查询第二次
    System.out.println(customerService.findById(1));
  }
}

2.7 运行测试

Spring Boot整合EhCache的步骤详解

从结果可以看出,第一次调用Service的时候,到Service内部获取数据。但是第二次调用Service时已经不需要从Service获取数据,证明第一次查询的时候已经把Customer对象缓存到EhCache中。

3 EhCache常用注解 @Cacheable: 主要针对方法配置,能够根据方法的请求参数对其进行缓存 @CacheConfig: 统一配置本类的缓存注解的属性 @CachePut:保证方法被调用,又希望结果被缓存。与@Cacheable区别在于是否每次都调用方法,常用于更新 @CacheEvict :清空缓存 @Cacheable/@CachePut/@CacheEvict 主要的参数: value:缓存的名称,在 spring 配置文件中定义,必须指定至少一个

例如:

@Cacheable(value=”mycache”) 或者

@Cacheable(value={”cache1”,”cache2”}

key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,

如果不指定,则缺省按照方法的所有参数进行组合

例如:

@Cacheable(value=”testcache”,key=”#id”)

condition:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,

只有为 true 才进行缓存/清除缓存

例如:@Cacheable(value=”testcache”,cOndition=”#userName.length()>2”)

unless 否定缓存。当条件结果为TRUE时,就不会缓存。

@Cacheable(value=”testcache”,unless=”#userName.length()>2”)

allEntries

(@CacheEvict ): 是否清空所有缓存内容,缺省为 false,如果指定为 true,

则方法调用后将立即清空所有缓存

例如:

@CachEvict(value=”testcache”,allEntries=true)

beforeInvocation

(@CacheEvict): 是否在方法执行前就清空,缺省为 false,如果指定为 true,

则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法

执行抛出异常,则不会清空缓存

例如:

@CachEvict(value=”testcache”,beforeInvocation=true)

3.1 @Cacheable

@Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存。

@Cacheable(value = "customer" ,key = "targetClass + methodName +#p0")
public List queryAll(Customer cust) {
  return customerDao.findAllByUid(cust);
}

3.2 @CacheConfig

当我们需要缓存的地方越来越多,你可以使用@CacheConfig(cacheNames = {"myCache"})注解来统一指定value的值,这时可省略value,如果你在你的方法依旧写上了value,那么依然以方法的value值为准。

使用方法如下:

@CacheConfig(cacheNames = {"myCache"})
public class UserServiceImpl implements UserService {
  @Override
  @Cacheable(key = "targetClass + methodName +#p0")//此处没写value
  public List findUsers(int num) {
    return userDao.findUsers(num);
  }
  .....
}

3.3 @CachePut

@CachePut注解的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用 。简单来说就是用户更新缓存数据。但需要注意的是该注解的value 和 key 必须与要更新的缓存相同,也就是与@Cacheable 相同。示例:

@CachePut(value = "customer", key = "targetClass + #p0")
public Customer updata(Customer cust) {
  Customer customer = customerDao.findAllById(cust.getId());
  customer.updata(cust);
  return customer ;
}

@Cacheable(value = "customer", key = "targetClass +#p0")//清空缓存
public Customer save(Customer cust) {
  customerDao.save(cust);
  return cust;
}

3.4 @CacheEvict

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 。

@Cacheable(value = "customer",key = "#p0.id")
public Customer save(Customer cust) {
  customerDao.save(cust);
  return job;
}

//清除一条缓存,key为要清空的数据
@CacheEvict(value="customer",key="#id")
public void delect(int id) {
  customerDao.deleteAllById(id);
}

//方法调用后清空所有缓存
@CacheEvict(value="customerCache",allEntries=true)
public void delectAll() {
  customerDao.deleteAll();
}

//方法调用前清空所有缓存
@CacheEvict(value="customerCache",beforeInvocation=true)
public void delectAll() {
  customerDao.deleteAll();
}

总结

以上所述是小编给大家介绍的Spring Boot整合EhCache的步骤详解,希望对大家有所帮助!


推荐阅读
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
author-avatar
xin丶儿_462
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有