spring cache缓存
- 导入坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId> <version>2.7.3</version>
</dependency>
- 常用注解
在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个:
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能,通常加在启动类上 |
@Cacheable | 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
1. @EnableCaching
@EnableCaching
注解用于开启Spring缓存注解功能,通常加在Spring Boot应用的启动类上:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching // 开启缓存注解功能
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. @Cacheable
@Cacheable
注解用于在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中:
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable(value = "users", key = "#userId")
public User getUserById(Long userId) {
// 模拟从数据库中查询数据
return findUserByIdFromDatabase(userId);
}
private User findUserByIdFromDatabase(Long userId) {
// 模拟数据库查询
return new User(userId, "John Doe");
}
}
3. @CachePut
@CachePut
注解用于将方法的返回值放到缓存中:
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
// 模拟更新数据库中的数据
updateUserInDatabase(user);
return user;
}
private void updateUserInDatabase(User user) {
// 模拟数据库更新
// ...
}
}
4. @CacheEvict
@CacheEvict
注解用于将一条或多条数据从缓存中删除:
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CacheEvict(value = "users", key = "#userId")
public void deleteUser(Long userId) {
// 模拟从数据库中删除数据
deleteUserFromDatabase(userId);
}
private void deleteUserFromDatabase(Long userId) {
// 模拟数据库删除
// ...
}
}
综合示例
以下是一个综合示例,展示如何在同一个服务类中使用这些注解:
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 = "users", key = "#userId")
public User getUserById(Long userId) {
// 模拟从数据库中查询数据
return findUserByIdFromDatabase(userId);
}
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
// 模拟更新数据库中的数据
updateUserInDatabase(user);
return user;
}
@CacheEvict(value = "users", key = "#userId")
public void deleteUser(Long userId) {
// 模拟从数据库中删除数据
deleteUserFromDatabase(userId);
}
private User findUserByIdFromDatabase(Long userId) {
// 模拟数据库查询
return new User(userId, "John Doe");
}
private void updateUserInDatabase(User user) {
// 模拟数据库更新
// ...
}
private void deleteUserFromDatabase(Long userId) {
// 模拟数据库删除
// ...
}
}
自定义键值对的使用示例:根据查询条件生成键值
/**
* 分页查询菜品
*
* @param dishPageQueryDTO 查询条件
* @return 菜品列表
*/
@GetMapping("/page")
@Cacheable(cacheNames = "dishCache", keyGenerator = "customKeyGenerator")
public Result getDishesByPage(DishPageQueryDTO dishPageQueryDTO) {
log.info("菜品分页查询:{}", dishPageQueryDTO);
PageResult dishesByPage = dishService.getDishesByPage(dishPageQueryDTO);
return Result.success(dishesByPage);
}