Spring Cache是Spring提供的一个缓存框架,基于AOP原理,实现了基于注解的缓存功能,只需要简单地加一个注解就能实现缓存功能,对业务代码的侵入性很小。
1. 常用的 Spring Cache 注解
@EnableCaching
:开启缓存功能。@Cacheable
:将方法返回值缓存,适用于读取操作。@CacheEvict
:清除缓存,常用于删除或更新数据时。@CachePut
:每次调用方法时都将返回值缓存,适用于更新缓存。@Caching
:组合多个缓存注解,以便同时执行多个缓存操作。@CacheConfig
:用于配置类的统一缓存配置,如指定缓存的名称等。
2. Spring Cache 的使用
2.1 引入依赖
在使用 Spring Cache 之前,需要在项目的 pom.xml
中引入相关依赖(例如,使用 Redis 作为缓存时需引入 Spring Data Redis 的依赖)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2 启用缓存功能
在 Spring Boot 应用的启动类上添加 @EnableCaching
注解,开启缓存支持。
@SpringBootApplication
@EnableCaching
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2.3 配置缓存管理器
使用 Redis 作为缓存时,可以通过配置类来定义 CacheManager
。例如:
@Configuration
public class CacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(60)) // 设置缓存有效期
.disableCachingNullValues(); // 不缓存null值
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfiguration)
.build();
}
}
2.4 在业务方法中使用缓存注解
在业务逻辑中,通过注解来声明需要缓存的操作。
2.4.1 @Cacheable
适用于查询操作,若缓存中已有数据则返回缓存数据,若没有则执行方法并将结果缓存。
@Cacheable(value = "users", key = "#userId")
public User getUserById(String userId) {
// 模拟从数据库获取用户信息
return userRepository.findById(userId).orElse(null);
}
Cacheable注解配置的两项参数说明:
value:缓存的名称,缓存名称作为缓存key的前缀。
key: 缓存key,支持SpEL表达式,上述代码表示取参数id的值作为key
最终缓存key为:缓存名称+“::”+key,例如:上述代码id为123,最终的key为:JZ_CACHE:SERVE_RECORD::123
SpEL(Spring Expression Language)是一种在 Spring 框架中用于处理字符串表达式的强大工具,它可以实现获取对象的属性,调用对象的方法操作。
keyGenerator:指定一个自定义的键生成器(实现 org.springframework.cache.interceptor.KeyGenerator 接口的类),用于生成缓存的键。与 key 属性互斥,二者只能选其一。
cacheManager:表示缓存管理器,通过缓存管理器可以设置缓存过期时间。
2.4.2 @CacheEvict
适用于删除缓存操作。例如,当更新或删除某个数据时,清除相应的缓存。
@CacheEvict(value = "users", key = "#userId")
public void deleteUserById(String userId) {
userRepository.deleteById(userId);
}
2.4.3 @CachePut
适用于更新缓存数据,每次调用方法时都将更新缓存
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
3. Spring Cache 的工作原理
3.1 基于 AOP
Spring Cache 是基于 Spring 的 AOP 原理实现的。在执行被缓存的方法之前,代理对象会先检查缓存中是否已经有数据,如果有则直接返回缓存数据,不再执行方法。
3.2 缓存存储和管理
如果缓存中没有数据,则调用实际方法执行,并将方法的返回值存储到缓存中,供下次调用时使用。
3.3 注解作用
通过注解(如 @Cacheable
等),开发者无需显式地编写缓存逻辑,Spring Cache 自动处理缓存的存取和失效操作。