¡Trabajar juntos para crear y crecer juntos! Este es el día 24 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de agosto", haga clic para ver los detalles del evento
Spring Boot integra caché de Redis
En este capítulo, integramos SpringBoot con el caché de Redis. Redis es un almacenamiento de estructura de datos basado en memoria de código abierto que se puede usar como base de datos, caché y agente de mensajes. En este capítulo, solo se explica la integración del caché.
Preparación
Herramientas y entorno del proyecto actual
- Herramientas de desarrollo IDEA 2022
- Experto en gestión de dependencias
- Bota de primavera
- JDK 1.8
- redis
Ahora vaya a inicializar un sitio web de Spring para generar inicialmente un proyecto SpringBoot
Nuevo proyecto
Después de hacer clic en Siguiente, establezca el nombre del proyecto, haga clic en Finalizar para completar la creación del proyecto
nuevo objeto de entidad
Para almacenar datos en redis, debemos definir una entidad con la que interactuar y serializar el objeto de la entidad.
Usuario.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;
}
复制代码
Manipulación de datos 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 api de la interfaz
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 aplicación.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
Directorio raíz del proyecto, docker-compose up -d
comience conredis
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>
复制代码
Habilitar caché e inicializar datos
Agregue anotaciones a la clase de inicio para @EnableCaching
abrir el caché
e implementar la interfaz CommandLineRunner para realizar las tareas después de que se complete el inicio
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());
}
}
复制代码
Añadir caché
Cuando el valor consultado de nuestra base de datos debe colocarse en el caché, use la @Cacheable
anotación
@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 y localhost:8080/3 dos veces
Si se encuentra que la identificación es 3, irá una vez. El método indica que el caché es exitoso
. La identificación de 1 irá dos veces porque la condición es a menos que se establezca y no se almacenará en caché para redis.
actualizar caché
Cada vez que el valor de nuestra base de datos va a cambiar, nuestro caché también cambia, podemos usar la anotación @CachePut
@CachePut(value = "users", key = "#user.id")
@PutMapping("/update")
public User updatePersonByID(@RequestBody User user) {
userRepository.save(user);
return user;
}
复制代码
borrar caché
Cuando nuestros datos se eliminan de la base de datos, también debemos eliminarlos del caché. Podemos usar la @CacheEvict
anotación
allEntries para borrar todo el contenido del caché. El valor predeterminado es falso. Si se especifica como verdadero, todos los cachés se borrarán inmediatamente después. se llama el método.
@CacheEvict(value = "users", allEntries=true)
@DeleteMapping("/{id}")
public void deleteUserByID(@PathVariable Long id) {
logger.info("删除用户根据ID-> {}", id);
userRepository.deleteById(id);
}
复制代码
Verifique en redis que no haya caché. La dirección de descarga de la herramienta de visualización de redis está github
allí .