Spring Cacher 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能
Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:
- EHCache
- Caffeine
- Reids
注意事项:
在使用该框架前需要导入SpringDataRedis的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
导入Spring Cache依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.7.3</version>
</dependency>
常用注解
注解 | 说明 |
@EnableCaching | 开启缓存注解功能,通常加在启动类上 |
@CACHEABLE | 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据,如果没有缓存数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
@EnableCaching 开启缓存注解功能
@CachePut(...) 将方法的返回值放到缓存中
它有两个属性:
cacheNames : 指定缓存名称
key : 与cacheNames合并做redis中的key(唯一)
key的写法:
1.#user 与形参名对应
//形参名叫什么就#什么 会在方法返回时取得user.id不用担心前端传null Id报错
@PostMapping
@CachePut(cacheNames = "userCache", key = "#user.id")
public User save(@RequestBody User user) {
userMapper.insert(user);
return user;
}
2.#result 与方法返回值对应
3.#p? 与形参顺序对应
//p0代表第一个形参 p1代表第二个形参
@PostMapping
@CachePut(cacheNames = "userCache", key = "#p0.id")
public User save(@RequestBody User user) {
userMapper.insert(user);
return user;
}
4.#a? 与形参顺序对应
与p?用法一致
5.#root 可以获取方法中的所有参数
//root.args可以获取形参列表 使用索引下标即可获得指定参数
@PostMapping
@CachePut(cacheNames = "userCache", key = "#root.args[0].id")
public User save(@RequestBody User user) {
userMapper.insert(user);
return user;
}
root还可以获取很多的方法信息:
注意事项:
Redis中的key组成: cacheNames::key
@Cacheable (重要)
作用:在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
//在方法执行前会将cacheNames和key进行拼接去redis查询是否有缓存,
//如果有他会直接返回缓存数据,下面的getById方法不会执行。
//如果没有他会调用方法并在方法结束后将方法的返回值放入缓存中
@GetMapping
@Cacheable(cacheNames = "userCache" , key = "#id")
public User getById(Long id){
User user = userMapper.getById(id);
return user;
}
@CacheEvict 将一条或多条数据从缓存中删除
//删除指定的一条缓存
@DeleteMapping
@CacheEvict(cacheNames = "userCache" , key = "#id")
public void deleteById(Long id){
userMapper.deleteById(id);
}
//删除userCache内的所有缓存 allEntries代表路径下所有
@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache", allEntries = true)
public void deleteAll() {
userMapper.deleteAll();
}