Índice
1. Anotações comuns para Spring Cache
2. Spring Cache usa etapas de cache redis
1. Introdução ao Spring Cache
Spring cache é uma estrutura que implementa funções de cache baseadas em anotações. Você só precisa adicionar uma anotação para implementar o cache.
Função. Spring Cache fornece uma camada de abstração e a camada inferior pode alternar diferentes implementações de cache. Especificamente, CacheManager
Interface para unificar diferentes tecnologias de cache.
CacheManager é uma interface abstrata para várias tecnologias de cache fornecidas pelo Spring.
Diferentes CacheManagers precisam ser implementados para diferentes tecnologias de cache:
CacheManager | descrever |
EhcachecacheManager | Usando EhCache como tecnologia de cache |
GuavaCacheManager | Usando o GuavaCache do Google como tecnologia de cache |
RedisCacheManager | Usando Redis como tecnologia de cache |
1. Anotações comuns para Spring Cache
anotação | ilustrar |
@EnableCaching | Habilitar função de anotação de cache |
@Cacheável | Antes de o método ser executado, o Spring primeiro verifica se há dados no cache. Se houver dados, ele retorna os dados armazenados em cache diretamente. Se não houver dados, ele chama o método e coloca o valor de retorno do método no cache. |
@CachePut | Coloque o valor de retorno do método no cache |
@CacheEvict | Exclua um ou mais dados do cache |
No projeto Spring Boot, para usar a tecnologia de cache, você só precisa importar o pacote de dependência da tecnologia de cache relevante para o projeto e usá-lo na classe de inicialização
@EnableCaching pode ativar o suporte de cache.
Por exemplo, para usar Redis como tecnologia de cache, você só precisa importar as coordenadas maven dos dados Spring Redis.
2. Spring Cache usa etapas de cache redis
1. Adicione dependências
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. Adicionar configuração
spring
redis:
host: 172.17.2.94 #ip地址
port: 6379 #端口
password: root@123456 #redis密码
database: 0 #指定数据库
cache:
redis:
time-to-live: 1800000 #设置缓存过期时间,可选
3. Use anotações
Anote a classe de inicialização: @EnableCaching
@Slf4j
@SpringBootApplication
@EnableCaching
public class CacheDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CacheDemoApplication.class,args);
log.info("项目启动成功...");
}
}
Anotação @CachePut: Coloque o valor de retorno do método no cache
/**
* CachePut:将方法返回值放入缓存
* value:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/
//@CachePut(value = "userCache",key = "#result.id")//result带表返回值
@CachePut(value = "userCache",key = "#user.id")//可以直接获取参数,参数名要保持一致
@PostMapping
public User save(User user){
userService.save(user);
return user;
}
key suporta a linguagem de expressão do Spring, que pode calcular dinamicamente o valor da chave e obtê-lo por meio de #, geralmente usando parâmetros #+ diretos
resultado: representa o valor de retorno, você pode obter a chave obtendo o valor de retorno
Anotação @CacheEvict: limpe o cache especificado
/**
* CacheEvict:清理指定缓存
* value:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/
@CacheEvict(value = "userCache",key = "#p0")//p固定写法,0表示下表,第一个参数
//@CacheEvict(value = "userCache",key = "#root.args[0]")//固定写法,0表示下表,第一个参数
//@CacheEvict(value = "userCache",key = "#id")//直接获取参数
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id){
userService.removeById(id);
}
//@CacheEvict(value = "userCache",key = "#p0.id")//p0第一个参数,id参数的属性
//@CacheEvict(value = "userCache",key = "#user.id")//直接获取参数属性
//@CacheEvict(value = "userCache",key = "#root.args[0].id")//获取第一个参数,id参数的属性
@CacheEvict(value = "userCache",key = "#result.id")//从返回值获取
@PutMapping
public User update(User user){
userService.updateById(user);
return user;
}
Anotação @Cacheable: Antes de o método ser executado, o Spring primeiro verifica se há dados no cache. Se houver dados, ele retorna diretamente os dados armazenados em cache. Se não houver dados, ele chama o método e coloca o valor de retorno do método em a cache.
/**
* Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
* value:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
* condition:条件,满足条件时才缓存数据
* unless:满足条件则不缓存
*/
@Cacheable(value = "userCache",key = "#id",unless = "#result == null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
User user = userService.getById(id);
return user;
}
@Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")//动态拼接key
@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;
}