Spring Cache
是 Spring 提供的缓存抽象框架,能够将数据缓存到内存或外部缓存中,减少数据库或远程服务的访问频率,从而显著提升应用性能。Spring Cache 通过注解的方式实现缓存逻辑,使用方便,支持多种缓存实现,例如 ConcurrentMap
、EhCache
、Redis
等。
1. Spring Cache 介绍
1.1 简介
Spring Cache 的核心是缓存抽象,通过注解方式自动管理缓存内容。Spring Cache 的特点包括:
- 缓存抽象:Spring Cache 提供了统一的缓存 API,可以通过不同的缓存实现(如 Redis、EhCache)来存储数据。
- 简洁易用:只需简单的注解,开发者可以在业务逻辑代码中实现缓存。
- 支持多种缓存策略:支持多种缓存策略如自动刷新、过期、更新等,适合多种业务场景。
- 可扩展性:Spring Cache 支持多种第三方缓存库,允许在项目需求变化时灵活选择缓存策略。
1.2 依赖
java"><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2. 常用注解
Spring Cache 提供了丰富的注解来控制缓存的不同操作,以下是常用的注解:
在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
2.1 @EnableCaching
@EnableCaching
是 Spring Cache 的入口注解,用于启用 Spring 的缓存功能。这个注解通常加在 Spring Boot 启动类上。
java">@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
2.2 @Cacheable
在方法执行前,spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
java">@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {// 从数据库获取用户信息
}
2.3 @CachePut
java">@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {// 更新数据库中的用户信息return user;
}
说明:key的写法如下
#user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;
#result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;
#p0.id:#p0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#a0.id:#a0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#root.args[0].id:#root.args[0]指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数
的id属性作为key ;
2.4 @CacheEvict
- 作用:清除缓存,通常用于删除操作。
- 属性:
java">@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {// 删除数据库中的用户信息
}
2.5 @Caching
当一个方法需要同时具备多种缓存操作时,可以用 @Caching
组合多个缓存注解。
java">@Caching(put = { @CachePut(value = "users", key = "#user.id") },evict = { @CacheEvict(value = "usernames", key = "#user.username") }
)
public User updateUser(User user) {// 更新用户信息return user;
}