Spring Cache入门介绍了Spring框架中缓存的集成与使用,包括依赖引入、配置方法和常见注解的使用。文章详细讲解了如何通过简单的注解和配置来简化缓存操作,同时提供了多种应用场景和示例代码,帮助开发者快速上手Spring Cache。
引入SpringCacheSpringCache简介
Spring Cache是Spring框架提供的一套用于集成缓存的抽象层。它简化了缓存的使用,使得开发者能够通过简单的注解和配置来使用各种缓存技术(如Ehcache、Redis等)。Spring Cache通过提供统一的接口来管理和操作缓存,从而提高了代码的可维护性和可扩展性。
SpringCache的优势与应用场景
优势
- 简化缓存使用:通过注解和配置简化了缓存的使用,使代码更加简洁。
- 统一接口:提供统一的缓存接口,支持多种缓存实现(如Ehcache、Redis等)。
- 灵活配置:缓存策略、缓存失效时间等都可以灵活配置。
- 减少数据库压力:通过缓存减少对数据库的直接访问,提高系统性能。
应用场景
- 减少重复计算:缓存频繁调用且计算昂贵的方法的结果。
- 提高响应速度:缓存读操作结果,减少数据库访问时间。
- 减轻数据库压力:通过缓存减轻数据库的读写操作。
- 提升用户体验:减少等待时间和提高响应速度,从而提升用户体验。
引入SpringCache依赖
在项目中引入Spring Cache依赖,可以在pom.xml
文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
对于使用Maven的项目,直接在pom.xml
文件中添加上述依赖即可。对于Gradle项目,可以在build.gradle
文件中添加如下依赖:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-cache'
}
配置SpringCache
编写配置文件
在Spring项目中,可以通过配置文件来配置Spring Cache。配置文件通常位于src/main/resources
目录下,并命名如application.properties
或application.yml
。
application.properties示例
# 配置缓存管理器
spring.cache.type=simple
# 配置缓存失效时间
spring.cache.cache-names=exampleCache
spring.cache.expiry=300
application.yml示例
spring:
cache:
type: simple
cache-names: exampleCache
expiry: 300
使用注解进行简单配置
在Spring中,可以通过注解来配置缓存。最常用的注解包括@EnableCaching
、@Cacheable
、@CachePut
、@CacheEvict
等。
1. 启动缓存注解
要使用Spring Cache注解,需要在Spring Boot的主类上添加@EnableCaching
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class CacheApplication {
public static void main(String[] args) {
SpringApplication.run(CacheApplication.class, args);
}
}
2. 使用@Cacheable
注解
@Cacheable
用于标记方法,表示该方法的结果会被缓存起来。当方法被调用时,会先从缓存中查找结果,如果找到则直接返回缓存中的值,否则执行方法并缓存结果。
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class CacheService {
@Cacheable(value = "exampleCache", key = "#id")
public String getDataById(String id) {
// 模拟数据获取
return "Data for id: " + id;
}
}
常见的SpringCache配置参数
1. value
或cacheNames
指定缓存的名称。可以指定一个或多个缓存名。
@Cacheable(value = "exampleCache")
2. key
提供自定义缓存键。可以是一个SpEL表达式,也可以是一个值。
@Cacheable(value = "exampleCache", key = "#id")
3. condition
指定一个SpEL表达式,当条件为true
时,才会将数据放入缓存。
@Cacheable(value = "exampleCache", key = "#id", condition = "#id != null")
使用SpringCache注解
@Cacheable注解的使用
@Cacheable
注解用于标记方法,表示该方法的结果会被缓存起来。当方法被调用时,会先从缓存中查找结果,如果找到则直接返回缓存中的值,否则执行方法并缓存结果。
示例
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable(value = "userCache", key = "#id")
public User getUserById(String id) {
// 模拟数据获取
return new User(id, "张三");
}
}
@CachePut注解的使用
@CachePut
注解用于更新缓存。每当被@CachePut
注解的方法被调用时,都会执行方法并更新缓存,即使该方法的结果已经在缓存中存在。
示例
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CachePut(value = "userCache", key = "#id")
public User updateUserById(String id, User user) {
// 模拟数据更新
return user;
}
}
@CacheEvict注解的使用
@CacheEvict
注解用于清除缓存。可以指定清除单个缓存项或整个缓存。
示例
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CacheEvict(value = "userCache", key = "#id")
public void deleteUserById(String id) {
// 模拟数据删除
}
}
自定义缓存管理器
创建自定义缓存管理器
Spring允许开发者自定义缓存管理器来实现特定的缓存策略。可以通过继承org.springframework.cache.CacheManager
接口来自定义缓存管理器。
示例
import org.springframework.cache.CacheManager;
import org.springframework.cache.Cache;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(
new ConcurrentMapCache("exampleCache"),
new ConcurrentMapCache("anotherCache")
));
return cacheManager;
}
}
自定义缓存管理器的配置与使用
自定义缓存管理器可以通过配置文件或代码来设置各个缓存的属性,如缓存名称、缓存失效时间等。
配置文件示例
# 配置缓存管理器
spring.cache.type=simple
spring.cache.cache-names=userCache,anotherCache
spring.cache.expiry=300
代码示例
import org.springframework.cache.CacheManager;
import org.springframework.cache.Cache;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(
new ConcurrentMapCache("exampleCache"),
new ConcurrentMapCache("anotherCache")
));
return cacheManager;
}
}
实战案例解析
创建缓存示例程序
案例描述
假设有一个获取用户信息的接口,该接口频繁被调用,每次查询都直接从数据库获取数据,消耗了大量资源。通过使用Spring Cache,可以将用户信息缓存起来,从而减少数据库访问。
实现步骤
- 创建缓存服务
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable(value = "userCache", key = "#id")
public User getUserById(String id) {
// 模拟数据库查询
return new User(id, "张三");
}
}
- 创建用户实体类
public class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
- 配置缓存
在application.properties
中配置缓存:
# 配置缓存管理器
spring.cache.type=simple
spring.cache.cache-names=userCache
spring.cache.expiry=300
注解的综合使用实践
示例
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable(value = "userCache", key = "#id")
public User getUserById(String id) {
// 模拟数据库查询
return new User(id, "张三");
}
@CachePut(value = "userCache", key = "#id")
public User updateUserById(String id, User user) {
// 模拟数据更新
return user;
}
@CacheEvict(value = "userCache", key = "#id")
public void deleteUserById(String id) {
// 模拟数据删除
}
}
缓存失效与更新策略
缓存失效策略
缓存失效策略通常包括缓存时间过期、缓存项被替换等。
- 缓存时间过期
# 配置缓存管理器
spring.cache.type=simple
spring.cache.cache-names=userCache
spring.cache.expiry=300
- 缓存项被替换
使用ConcurrentMapCache
时,当缓存项数量超过最大数量时,会自动替换最旧的缓存项。
缓存更新策略
- 自动更新
使用@CachePut
注解,每次调用方法时都会更新缓存。
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CachePut(value = "userCache", key = "#id")
public User updateUserById(String id, User user) {
// 模拟数据更新
return user;
}
}
- 手动更新
使用@CacheEvict
注解清除缓存,再调用方法更新缓存。
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CacheEvict(value = "userCache", key = "#id")
public void deleteUserById(String id) {
// 模拟数据删除
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章