Trabalhem juntos para criar e crescer juntos! Este é o 24º dia da minha participação no "Nuggets Daily New Plan · August Update Challenge", clique para ver os detalhes do evento
Spring Boot integra cache Redis
Neste capítulo, integramos o SpringBoot com o cache do Redis. O Redis é um armazenamento de estrutura de dados baseado em memória de código aberto que pode ser usado como banco de dados, cache e agente de mensagens. Neste capítulo, apenas a integração do cache é explicada.
Preparação
Ferramentas e ambiente atuais do projeto
- Ferramentas de Desenvolvimento IDEA 2022
- Especialista em Gerenciamento de Dependências
- Spring Boot
- JDK 1.8
- Redis
Agora vá para inicializar um site Spring para gerar inicialmente um projeto SpringBoot
Novo projeto
Após clicar em Avançar, defina o nome do projeto, clique em Concluir para concluir a criação do projeto
novo objeto de entidade
Para armazenar dados no redis, precisamos definir uma entidade para interagir e precisamos serializar o objeto de entidade
User.java
package com.github.gleans.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.*;
import java.io.Serializable;
@Data
@Entity
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "SEQ_USER", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
private Long id;
private String name;
private long money;
}
复制代码
Manipulação de dados concisa usando JPA
UserRepository.java
package com.github.gleans.dao;
import com.github.gleans.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* 操作数据库
*/
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
复制代码
código da API da interface
UserController.java
import com.github.gleans.dao.UserRepository;
import com.github.gleans.model.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
public class UserController {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Cacheable(cacheNames = "userAll")
@GetMapping("user/all")
public Object getUserAll() {
return userRepository.findAll();
}
@Cacheable(value = "users", key = "#userId", unless = "#result.money < 10000")
@GetMapping("user/con/{userId}")
public Object getUserByCondition(@PathVariable Long userId) {
return userRepository.findById(userId);
}
@CachePut(value = "users", key = "#user.id")
@PutMapping("/update")
public User updatePersonByID(@RequestBody User user) {
userRepository.save(user);
return user;
}
@CacheEvict(value = "users", allEntries=true)
@DeleteMapping("/{id}")
public void deleteUserByID(@PathVariable Long id) {
List<User> userListOld = userRepository.findAll();
log.info("删除前:{}", userListOld.toString());
userRepository.deleteById(id);
List<User> userList = userRepository.findAll();
log.info("删除后:{}", userList.toString());
}
}
复制代码
configurar aplicativo.yml
# Redis Config
spring:
datasource:
url: jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000
driverClassName: org.h2.Driver
username: root
password: root
cache:
type: redis
redis:
host: localhost
port: 6379
password: ekko1234
jpa:
show-sql: true
复制代码
Iniciar Redis
Diretório raiz do projeto, docker-compose up -d
comece comredis
Microsoft Windows [版本 10.0.17763.1339]
(c) 2018 Microsoft Corporation。保留所有权利。
C:\Users\ekko\Documents\SpringBootLearn>cd springboot-redis
C:\Users\ekko\Documents\SpringBootLearn\springboot-redis>docker-compose up -d
Creating network "springboot-redis_default" with the default driver
Creating my_redis ... done
C:\Users\ekko\Documents\SpringBootLearn\springboot-redis>
复制代码
Habilite o cache e inicialize os dados
Adicione anotações à classe de inicialização para @EnableCaching
abrir o cache
e implementar a interface CommandLineRunner para executar as tarefas após a conclusão da inicialização
SpringBootRedisApplication.java
import com.github.gleans.dao.UserRepository;
import com.github.gleans.model.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@Slf4j
//springboot启动时执行任务CommandLineRunner
@SpringBootApplication
//开启缓存
@EnableCaching
public class SpringBootRedisApplication implements CommandLineRunner {
private UserRepository userRepository;
public static void main(String[] args) {
SpringApplication.run(SpringBootRedisApplication.class, args);
}
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public void run(String... args) throws Exception {
log.info("开始初始化user ->user count ->{}", userRepository.count());
User james = new User(1L, "James", 2000);
User potter = new User(2L, "Potter", 4000);
User dumbledore = new User(3L, "Dumbledore", 999999);
userRepository.save(james);
userRepository.save(potter);
userRepository.save(dumbledore);
log.info("初始化完成 数据-> {}.", userRepository.findAll());
}
}
复制代码
Adicionar cache
Quando o valor consultado em nosso banco de dados for colocado no cache, use a @Cacheable
anotação
@Cacheable(value = "users", key = "#userId", unless = "#result.money < 10000")
@RequestMapping(value = "/{userId}", method = RequestMethod.GET)
public Object getUser(@PathVariable Long userId) {
logger.info("获取user信息根据ID-> {}.", userId);
return userRepository.findById(userId);
}
复制代码
Visitamos localhost:8080/1 e localhost:8080/3 duas vezes
Se for encontrado que o id é 3, ele irá uma vez.O método indica que o cache foi bem sucedido.O
id de 1 irá duas vezes porque a condição em except foi estabelecida e não será armazenada em cache para redis.
atualizar cache
Toda vez que o valor do nosso banco de dados vai mudar, nosso cache também muda, podemos usar a anotação @CachePut
@CachePut(value = "users", key = "#user.id")
@PutMapping("/update")
public User updatePersonByID(@RequestBody User user) {
userRepository.save(user);
return user;
}
复制代码
excluir cache
Quando nossos dados são excluídos do banco de dados, também precisamos excluí-los do cache. Podemos usar a @CacheEvict
anotação
allEntries para limpar todo o conteúdo em cache. O padrão é false. Se for especificado como true, todos os caches serão limpos imediatamente após o método é chamado.
@CacheEvict(value = "users", allEntries=true)
@DeleteMapping("/{id}")
public void deleteUserByID(@PathVariable Long id) {
logger.info("删除用户根据ID-> {}", id);
userRepository.deleteById(id);
}
复制代码
Verifique no redis se não há endereço de download da ferramenta de visualização do cache github
redis