针对不同的缓存技术需要实现不同的CacheManager:
CacheManager | 描述 |
---|---|
EhCacheCacHManager | 使用EhCache作为缓存技术 |
GuavaCacheManager | 使用Google的GuavaCache作为缓存技术 |
RedisCacheManager | 使用Redis作为缓存技术 |
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能 |
@Cacheable | 在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@cacheEvict | 将一条或多条数据从缓存中删除 |
在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
我们在使用简单的缓存技术的时候不用单独映入相应的依赖,使用spring-boot-starter-web这个包即可,但是要使用redis作为缓存就需要额外的引入依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-cacheartifactId>
dependency>
在启动类上加上注解@EnableCaching
@Autowired
private CacheManager cacheManager;
@Autowired
private UserService userService;
/**
* CachePut:将方法的返回值放入缓存
* value:缓存名称 每个缓存可以有多个key
* key:缓存的key #result.id:动态生成keyName进行缓存
*
*
*/
@CachePut(value = "userCache",key="#result.id")
// @CachePut(value = "userCache",key="#user.name") //将user->name作为缓存名
// @CachePut(value = "userCache",key="#user.id") //将user->id作为缓存名
@PostMapping
public User save(User user){
userService.save(user);
return user;
}
key值参数引用(SpEL动态获取)的说明:
该注解在没有缓存配置(如redis)的时候,会将数据缓存在ConcurrentMap里面,但是此缓存操作不具有持久化的储存,在服务重启之后会数据丢失。解决方法是使用Redis等缓存中间件。
/**
* CacheEvict:清理指定缓存
* value:缓存名称 每个缓存可以有多个key
* key:缓存的key #result.id:动态生成keyName进行缓存
*/
@CacheEvict(value = "userCache",key = "#id")
//@CacheEvict(value = "userCache",key = "#p0")
//@CacheEvict(value = "userCache",key = "#root.args[0]")
// 上述三种方式都是相同的效果,动态获取id的参数作为缓存的唯一标识
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id){
userService.removeById(id);
}
@CacheEvict(value = "userCache",key = "#user.id")
//@CacheEvict(value = "userCache",key = "#p0.id")
//@CacheEvict(value = "userCache",key = "#root.args[0].id")
//@CacheEvict(value = "userCache",key = "#result.id")
@PutMapping
public User update(User user){
userService.updateById(user);
return user;
}
/**
* Cacheable:在方法执行前spring先查看缓存中是否有数据,
* 如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中;
* value:缓存名称 每个缓存可以有多个key
* key:缓存的key #result.id:动态生成keyName进行缓存
* condition:满足条件就进行缓存,无法使用#result
* unless:满足条件就不进行缓存,可以使用#result-->看源码注解
*/
@Cacheable(value = "userCache", key = "#id", condition = "#unless == null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
User user = userService.getById(id);
return user;
}
在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中。
@Cacheable(value = "userCache", key = "#user.id+'_'+#user.name")
//多个变量的拼接
@GetMapping("/list")
public List<User> list(User user) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(user.getId() != null, User::getId, user.getId());
queryWrapper.eq(user.getName() != null, User::getName, user.getName());
List<User> list = userService.list(queryWrapper);
return list;
}
在Spring Boot项目中使用Spring Cache的操作步骤(使用redis缓存技术):
spring-boot-starter-data-redis
、spring-boot-starter-cache
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-cacheartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
2、配置application.yml
spring:
redis:
host: 127.0.0.1
port: 6379
password: 123456
database: 0
cache:
redis:
time-to-live: 1800000 #设置缓存过期时间,可选
3、在启动类上加入@EnableCaching注解,开启缓存注解功能
4、在Controller的方法上加入@Cacheable、@CacheEvict等注解,进行缓存操作
Demo项目源码:SpringCache-Demo