springboot+ehcache缓存遇到的坑

本文详细介绍了如何在SpringBoot项目中使用Ehcache进行缓存管理,包括配置ehcache.xml,引入配置文件,使用@Cacheable、@CachePut、@CacheEvict注解实现数据的缓存、更新与清除。

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

springboot+ehcache使用方法:

1.在src/main/resource里面配置ehcache.xml

2.在配置文件application.properties里引入echcache.xml

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

3.在springboot启动类里加上ehcache注解

4.在controller层里直接调用的service层方法上加入ehcache注解,实体类必须实现

implements Serializable 序列化

@CacheEvict必须作用在走代理的方法上,controller层直接调用service层的方法,不能在方法调用的方法上加入注解,否则注解无效

1.使用@Cacheable把数据存进缓存,下面就是专门把方法返回值存入缓存

@Service

@Transactional     //事务,表示该类下所有的都受事务控制

public class userServiceImpl implements userService {

    @Autowired

    private userMapper usermapper;

    @Override

    @Cacheable(value="users")

    public user selectUserById(int id) {

        user user=this.usermapper.selectUserById(id);

        System.out.println("1111111111111111111111111");

        return user;

    }

 

}

说明:1》@Cacheable可以标记在一个方法上,也可以标记在一个类上,当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果。

2》@Cacheable可以指定三个属性,value、key和condition。 value属性指定cache的名称(即选择ehcache.xml中哪种缓存方式存储)key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。我们也直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例

@Cacheable(value="users", key="#id")

public User find(Integer id) {

   return null;

}

@Cacheable(value="users", key="#p0")

public User find(Integer id) {

   retur nnull;

}

@Cacheable(value="users", key="#user.id")

public User find(User user) {

   retur nnull;

}

@Cacheable(value="users", key="#p0.id")

public User find(User user) {

   returnnull;

}

3》最后,使用@CacheEvict清除缓存;

@CacheEvict(value="users",allEntries=true)

public void saveUsers(Users users) {

this.usersRepository.save(users);

}

说明:@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。 其中value、key和condition的语义与@Cacheable对应的属性类似;allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

@CachePut 的作用 主要针对方法配置,如果缓存需要更新,且不干扰方法的执行,可以使用注解@CachePut。@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor)
清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素

@CacheEvict(cacheNames="books", beforeInvocation=true)
public void loadBooks(InputStream batch)
说明:

@Cacheable,@CachePut , @CacheEvict都有value属性,指定的是要使用缓存名称;key属性指定的是数据在缓存中的存储的键。@Cacheable(“something");这个相当于save()操作,@cachePut相当于Update()操作,只要他标示的方法被调用,那么都会缓存起来,而@Cacheable则是先看下有没已经缓存了,然后再选择是否执行方法。@CacheEvict相当于Delete()操作。用来清除缓存用的。
 

 

 

<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、付费专栏及课程。

余额充值