SpringBoot_07_Cache_02_EhCache

本文详细介绍了如何在SpringBoot项目中整合EhCache,包括创建子模块、引入依赖、配置ehcache.xml以及使用声明式缓存。通过具体步骤和代码示例,帮助读者掌握EhCache的配置和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在上一节 SpringBoot_07_Cache_01_快速入门 中,我们了解了 Spring 声明式缓存抽象,知道了:

  • 我们使用Spring声明式缓存,使用的是其抽象,无关底层实现。也就是说,不管你底层使用的是什么缓存技术,对Spring声明式缓存的使用是一致的
  • 若想要采用不同的缓存技术,只需要替换掉底层注册的 CacheManager 即可

那么,这一节我们将采用 EhCache 作为缓存技术,来实现一个Spring声明式缓存的实例,这显然就很简单了,步骤如下:

  • 引入 EhCache 依赖
  • 开启缓存支持
  • 配置ehcache(ehcache.xml)
  • 使用声明式缓存

其他步骤同上一步: SpringBoot_07_Cache_01_快速入门

一、SpringBoot 整合 EhCache

1.创建子模块

这里我们创建一个子模块,创建步骤同 SpringBoot_07_Cache_01_快速入门

group = 'com.ray.study'
artifact ='spring-boot-07-cache-ehcache'

2.引入依赖

2.1 继承父工程依赖

在父工程spring-boot-seedssettings.gradle加入子工程

rootProject.name = 'spring-boot-seeds'
include 'spring-boot-01-helloworld'
include 'spring-boot-02-restful-test'
include 'spring-boot-03-thymeleaf'
include 'spring-boot-04-swagger2'
include 'spring-boot-05-jpa'
include 'spring-boot-05-mybatis'
include 'spring-boot-05-tk-mybatis'
include 'spring-boot-06-nosql-redis'
include 'spring-boot-06-nosql-mongodb'
include 'spring-boot-07-cache-concurrentmap'
include 'spring-boot-07-cache-ehcache'

这样,子工程spring-boot-07-cache-ehcache就会自动继承父工程中subprojects `函数里声明的依赖,主要包含如下依赖:

		implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'

        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'

2.2 引入ehcache `依赖

将子模块spring-boot-07-cache-ehcachebuild.gradle修改为如下内容:

dependencies {
    // spring-boot-starter-cache  和 ehcache
    implementation 'org.springframework.boot:spring-boot-starter-cache'
    implementation 'net.sf.ehcache:ehcache'

    // mysql 驱动和 jpa
    implementation 'mysql:mysql-connector-java'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

3.数据库准备

同上一节: SpringBoot_07_Cache_01_快速入门

4.修改配置

4.1 修改application.yml

同上一节: SpringBoot_07_Cache_01_快速入门

4.2 CacheConfiguration

开启缓存支持

同上一节: SpringBoot_07_Cache_01_快速入门

4.3 配置ehcache.xml

(1)默认自动加载resources目录下的ehcache.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd">
    <!--timeToIdleSeconds 当缓存闲置n秒后销毁 -->
    <!--timeToLiveSeconds 当缓存存活n秒后销毁 -->
    <!-- 缓存配置
        name:缓存名称。
        maxElementsInMemory:缓存最大个数。
        eternal:对象是否永久有效,一但设置了,timeout将不起作用。
        timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
        timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
        overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。 diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
        maxElementsOnDisk:硬盘最大缓存个数。
        diskPersistent:是否缓存虚拟机重启期数据 Whether the disk
        store persists between restarts of the Virtual Machine. The default value
        is false.
        diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。  memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是
LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
        clearOnFlush:内存数量最大时是否清除。 -->
    
    
    <!-- 磁盘缓存位置 -->
    <diskStore path="java.io.tmpdir" />
    <!-- 默认缓存 -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">

        <persistence strategy="localTempSwap" />
    </defaultCache>

    <!-- 测试 -->
    <cache name="user"     
           eternal="false"
           timeToIdleSeconds="2400"
           timeToLiveSeconds="2400"
           maxEntriesLocalHeap="10000"
           maxEntriesLocalDisk="10000000"
           diskExpiryThreadIntervalSeconds="120"
           overflowToDisk="false"
           memoryStoreEvictionPolicy="LRU">
    </cache>
</ehcache>

注意
这里配置了一个 cacheName为 user 的cache,实际使用时指定的缓存名称必须是在此配置文件中存在的,否则会抛找不到cache的异常

@CachePut(value = "user", key = "#user.name")  // 这里的cacheName(即user)必须在ehcache.xml中存在
public User save(User user) {
    User u = userRepository.save(user);
    log.info("新增:缓存用户,用户id为:{}", u.getId());
    return u;
}

(2)对于EhCache的配置文件也可以通过application.yml文件中使用spring.cache.ehcache.config属性来指定,比如:

spring:
  cache:
    ehcache:
      config: classpath:ehcache.xml

(3)ehcache.xml配置文件详解

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

5.业务实现

同上一节: SpringBoot_07_Cache_01_快速入门

6.单元测试

同上一节: SpringBoot_07_Cache_01_快速入门

参考资料

  1. 梁桂钊__Spring Boot 揭秘与实战(二) 数据缓存篇 - EhCache
  2. SpringBoot学习-(十八)SpringBoot整合EhCache
<think>好的,我现在需要帮助用户寻找在Spring Boot 3.3.7中替换EhCacheCache的替代方案。首先,我要回顾一下用户的问题。用户之前可能在使用EhCache,但由于某些原因需要替换,比如升级到Spring Boot 3.x后可能遇到兼容性问题,或者EhCache不再满足需求。 首先,我应该确认EhCache在Spring Boot 3.3.7中的支持情况。根据引用内容中的引用[3],Spring Boot升级到3.x需要迁移到Jakarta EE,这可能影响到依赖库的兼容性。EhCache的旧版本可能依赖于javax包,而Spring Boot 3.x使用jakarta包,这可能导致EhCache无法直接使用,需要升级到支持Jakarta的版本。但用户可能想换其他缓存方案,所以需要提供替代方案。 接下来,我需要列出常见的Spring Boot支持的缓存方案。通常,Spring Boot集成了多种缓存提供者,比如Caffeine、Redis、Hazelcast、Infinispan等。此外,引用[4]提到dynamic-datasource-spring-boot-starter,但那是多数据源的,可能和缓存无关,不过可以忽略这点,专注于缓存替代方案。 我需要检查每个替代方案的适用性: 1. **Caffeine**:这是一个高性能的Java缓存库,Spring Boot原生支持,配置简单,适合本地缓存,替代EhCache的好选择。 2. **Redis**:分布式缓存,适合需要跨多个实例共享缓存的场景,如果用户的应用是分布式的,Redis是个不错的选择。 3. **Hazelcast**:既是缓存解决方案,也提供分布式数据网格功能,可以作为内存数据网格使用。 4. **Infinispan**:开源分布式缓存和数据网格平台,适合需要高度可扩展性的场景。 5. **Spring Boot内置的SimpleCache**:适用于简单场景,但功能有限,可能不适合生产环境。 6. **检查EhCache 3.x的兼容性**:EhCache 3.x是否支持Jakarta EE 9?如果支持,用户可能只需要升级EhCache版本,而无需替换。 然后,我需要为每个替代方案提供配置步骤,特别是如何在Spring Boot 3.3.7中集成。例如,对于Caffeine,需要添加依赖,配置缓存管理器,启用缓存注解等。 同时,需要注意用户可能遇到的问题,比如依赖的Jakarta兼容性,如引用[3]提到的,所有javax包需要改为jakarta,所以替代方案必须支持Jakarta EE 9。例如,Caffeine可能不涉及这些包,所以安全;而Redis的Spring Boot Starter可能已经适配了。 接下来,我需要确保提到的每个方案在Spring Boot 3.3.7中可用,并且有相应的依赖和配置示例。例如,Caffeine的依赖是spring-boot-starter-cache和Caffeine本身,配置在application.properties中设置缓存类型。 另外,用户可能需要知道如何迁移现有的EhCache配置到新的缓存方案。比如,从EhCache的XML配置转换到Caffeine的配置参数,或者使用Redis的配置方式。 最后,要生成相关问题,帮助用户进一步探索,比如性能比较、具体配置步骤、迁移注意事项等。</think>在Spring Boot 3.3.7中替换EhCacheCache的替代方案及实现步骤如下: ### 1. **Caffeine(推荐本地缓存方案)** Caffeine是高性能Java本地缓存库,Spring Boot原生支持,适用于单机高并发场景。 ```java // 添加依赖(pom.xml) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency> // 配置类 @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(1000)); return cacheManager; } } ``` 在`application.properties`中设置: ```properties spring.cache.type=caffeine ``` ### 2. **Redis(分布式缓存方案)** 适合需要跨服务共享缓存的分布式场景[^2]。 ```java // 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> // 配置类 @Configuration @EnableCaching public class RedisCacheConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory("localhost", 6379); } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)); return RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); } } ``` ### 3. **Hazelcast(内存数据网格)** 提供分布式缓存和计算能力,适合大规模数据处理。 ```java // 添加依赖 <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> </dependency> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast-spring</artifactId> </dependency> // 配置类 @Configuration @EnableCaching public class HazelcastConfig { @Bean public Config hazelcastConfig() { Config config = new Config(); config.getNetworkConfig().setPort(5701); return config; } @Bean public CacheManager cacheManager(HazelcastInstance hazelcastInstance) { return new HazelcastCacheManager(hazelcastInstance); } } ``` ### 4. **检查EhCache 3.x兼容性** 若仍需使用EhCache,需确保升级到支持Jakarta EE的版本[^3]: ```xml <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.10.0</version> </dependency> ``` 配置类需显式指定EhCache3实现: ```java @Bean public JCacheManagerFactoryBean ehCacheManagerFactory() { return new JCacheManagerFactoryBean(); } @Bean public CacheManager cacheManager() { return new JCacheCacheManager(ehCacheManagerFactory().getObject()); } ``` ### 迁移注意事项 - 移除旧版EhCache 2.x依赖,避免与Jakarta EE冲突 - 缓存注解(如`@Cacheable`)可保持语法不变 - 分布式缓存需调整序列化机制(如Redis使用JSON序列化)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值