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
Aprè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 -d
commencez 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 @EnableCaching
ouvrir 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' @Cacheable
annotation
@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' @CacheEvict
annotation
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);
}
复制代码
github
Vérifiez dans redis qu'il n'y a pas d'adresse de téléchargement de l'outil de visualisation de cache redis