Spring Boot 2.x intègre le cache Redis

Travailler ensemble pour créer et grandir ensemble ! C'est le 24ème jour de ma participation au "Nuggets Daily New Plan · August Update Challenge", cliquez pour voir les détails de l'événement

Spring Boot intègre le cache Redis

Dans ce chapitre, nous intégrons SpringBoot au cache Redis. Redis est un stockage de structure de données open source basé sur la mémoire qui peut être utilisé comme base de données, cache et courtier de messages. Dans ce chapitre, seule l'intégration du cache est expliquée.

Préparation

Outils et environnement actuels du projet

  • Outils de développement IDEA 2022
  • Maven de la gestion des dépendances
  • Botte de printemps
  • JDK 1.8
  • Redis

Maintenant, allez initialiser un site Web Spring pour générer initialement un projet SpringBoot

Nouveau projet

Nouveau module deux

sélectionner les dépendancesAprès avoir cliqué sur Suivant, définissez le nom du projet, cliquez sur Terminer pour terminer la création du projet

nouvel objet entité

Pour stocker des données dans redis, nous devons définir une entité avec laquelle interagir et nous devons sérialiser l'objet entité

Utilisateur.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;
}
复制代码

Manipulation concise des données à l'aide de 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>  {

}
复制代码

code API de l'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());
    }
}

复制代码

configurer application.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
复制代码

Démarrer Redis

Répertoire racine du projet, docker-compose up -dcommencez parredis

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>
复制代码

Activer le cache et initialiser les données

Ajoutez des annotations à la classe de démarrage pour @EnableCachingouvrir le cache
et implémentez l'interface CommandLineRunner pour effectuer les tâches une fois le démarrage terminé
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());
    }
}
复制代码

Ajouter un cache

Lorsque la valeur interrogée dans notre base de données doit être placée dans le cache, utilisez l' @Cacheableannotation

    @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);
    }
复制代码

Nous visitons localhost:8080/1 et localhost:8080/3 deux fois

S'il s'avère que l'identifiant est 3, il ira une fois. La méthode indique que le cache est réussi
. L'identifiant de 1 ira deux fois car la condition dans moins est établie et ne sera pas mise en cache dans redis.

actualiser le cache

Chaque fois que la valeur de notre base de données va changer, notre cache change également, nous pouvons utiliser l'annotation @CachePut

   @CachePut(value = "users", key = "#user.id")
    @PutMapping("/update")
    public User updatePersonByID(@RequestBody User user) {
        userRepository.save(user);
        return user;
    }
复制代码

supprimer le cache

Lorsque nos données sont supprimées de la base de données, nous devons également les supprimer du cache. Nous pouvons utiliser l' @CacheEvictannotation
allEntries pour effacer tout le contenu mis en cache. La valeur par défaut est false. S'il est spécifié comme true, tous les caches seront effacés immédiatement après la méthode est appelée.

    @CacheEvict(value = "users", allEntries=true)
    @DeleteMapping("/{id}")
    public void deleteUserByID(@PathVariable Long id) {
        logger.info("删除用户根据ID-> {}", id);
        userRepository.deleteById(id);
    }
复制代码

githubVérifiez dans redis qu'il n'y a pas d'adresse de téléchargement de l'outil de visualisation de cache redis

Adresse source

github.com/Gleans/Spri…

carte logique du cerveau

insérez la description de l'image ici

Je suppose que tu aimes

Origine juejin.im/post/7133409600677609486
conseillé
Classement