注解Cacheable
是 Spring 框架中用于缓存数据的方法或类的注解。通过使用这个注解,你可以避免重复计算和重复获取数据,从而提高应用程序的性能。
基本用法
- 引入依赖
确保在你的项目中引入了 Spring Cache 相关的依赖。如果你使用的是 Spring Boot,可以在 pom.xml
中添加以下依赖:
html
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
- 启用缓存
在主类或配置类上使用 @EnableCaching
注解来启用缓存功能。
java
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 使用
@Cacheable
注解
在需要缓存的方法上使用 @Cacheable
注解。
bash
@Service
public class UserService {
@Cacheable("lizz:users")
public User getUserById(Long id) {
// 模拟一个耗时的数据库查询
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new User(id, "John Doe");
}
}
- 配置缓存
Spring 提供了多种缓存实现,包括内存缓存(如 ConcurrentMapCache)、第三方缓存(如 EhCache、Caffeine、Redis 等)。可以在配置文件(如 application.properties
或 application.yml
)中进行配置。
- 使用 ConcurrentMapCache本地缓存
bash
spring:
cache:
type: simple
- 使用 Redis 作为缓存
bash
spring:
cache:
type: redis
redis:
host: 172.1.1.11
port: 6379
高级用法
- 缓存条件:
condition
使用 condition
属性指定缓存条件,只换成id大于10的数据缓存
java
@Cacheable(value = "lizz:users", condition = "#id > 10")
public User getUserById(Long id) {
// ...
}
- 自定义缓存键
使用 key
属性自定义缓存键。
java
@Cacheable(value = "users", key = "#root.methodName + #id")
public User getUserById(Long id) {
// ...
}
- **同步更新:**sync
sync=true时,如果多个线程同时访问缓存中没有的数据,只有一个线程会执行方法以加载数据,其他线程会等待加载完成并获取相同的结果。这可以防止缓存穿透(即多个线程同时访问缓存时都绕过缓存直接访问底层存储)。
java
@Cacheable(value = "users", sync = true)
public User getUserById(Long id) {
// ...
}
缓存失效:@CacheEvict
- allEntries=true:清除所有缓存数据
java
@CacheEvict(value = "lizz:users", allEntries = true)
public void clearCache() {
// //清除全部缓存相关的其他业务操作
}
- key = "#id" :清除缓存集合中指定key的数据
java
@CacheEvict(value = "lizz:users", key = "#id")
public void delUser(Long id) {
//清除id缓存相关的其他业务操作
}
- 缓存同步:
@CachePut
使用 @CachePut
注解更新缓存。
java
@CachePut(value = "lizz:users", key = "#user.id")
public User updateUser(User user) {
// 更新用户的逻辑
return user;
}
结合缓存组件
- 引入caffeine
html
<!--快速本地缓存-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
- 使用caffeine作为springcache管理
java
@EnableCaching
@Configuration
public class CaffeineCacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("ta:region");
cacheManager.setCaffeine(caffeineCacheBuilder());
return cacheManager;
}
Caffeine<Object, Object> caffeineCacheBuilder() {
return Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES)
.maximumSize(100);
}
}