Spring Boot 2.x integra caché Redis

¡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

Nuevo Módulo dos

seleccionar dependenciasDespué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 -dcomience 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 @EnableCachingabrir 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 @Cacheableanotació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 @CacheEvictanotació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á githuballí .

Dirección de la fuente

github.com/Gleans/Sp…

mapa lógico del cerebro

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin juejin.im/post/7133409600677609486
Recomendado
Clasificación