Maison >base de données >Redis >Comment SpringBoot intègre Spring Cache pour implémenter la mise en cache Redis

Comment SpringBoot intègre Spring Cache pour implémenter la mise en cache Redis

PHPz
PHPzavant
2023-05-27 08:47:111327parcourir

    1. Introduction

    Spring Cache est un framework qui implémente la fonction de mise en cache basée sur les annotations. Il vous suffit d'ajouter une annotation pour réaliser la fonction de mise en cache.

    Spring Cache fournit une couche d'abstraction et la couche inférieure peut changer différentes implémentations de cache.

    Plus précisément, différentes technologies de mise en cache sont unifiées via l'interface CacheManager.

    CacheManager est une interface abstraite pour diverses technologies de mise en cache fournies par Spring. Il s'agit de la technologie de mise en cache par défaut et elle est mise en cache dans Map. Cela signifie également que lorsque le service raccroche, les données mises en cache disparaîtront.

    Différents CacheManagers doivent être implémentés pour différentes technologies de mise en cache

    CacheManager Description
    EhCacheCacheManager Utiliser EhCache comme technologie de mise en cache
    GuavaC ache Manager utilise GuavaCache de Google comme technologie de mise en cache
    RedisCacheManager Utilisez Redis comme technologie de mise en cache

    2 Annotations communes

    Dans le projet Spring Boot, pour utiliser la technologie de mise en cache, il vous suffit d'importer le package de dépendances de la technologie de mise en cache appropriée dans le projet. et utilisez-le sur la classe de démarrage @EnableCaching Activez simplement la prise en charge de la mise en cache. Par exemple, pour utiliser Redis comme technologie de mise en cache, il vous suffit d'importer les coordonnées maven de Spring data Redis. Les annotations couramment utilisées sont les suivantes :

    Ouvrez la fonction de solution de pari d'altitude@cacheable pour vérifier s'il y a dans le cache avant que la méthode n'exécute l'exécution de la méthode. il y a des données, renvoyez directement les données mises en cache ; s'il n'y a pas de données, appelez la méthode et mettez la valeur de retour de la méthode dans le cacheMettez la valeur de retour de la méthode dans le cacheSupprimer une ou plusieurs données du cache
    Remarque @@ENableCaching
    @CachePut
    @CacheEvict

    2.1, @EnableCaching

    La fonction principale de cette annotation est d'activer la fonction d'annotation de cache et de faire prendre effet aux autres annotations Spring Cache. L'utilisation est également très simple, il suffit de l'ajouter directement au-dessus de la classe de démarrage du projet.

    @Slf4j
    @SpringBootApplication
    @EnableCaching
    public class CacheDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(CacheDemoApplication.class, args);
            log.info("项目启动成功...");
        }
    }

    2.2, l'annotation @Cacheable

    @Cacheable est principalement utilisée pour vérifier s'il y a des données dans le cache avant d'exécuter la méthode. S'il y a des données, les données mises en cache sont renvoyées directement ; s'il n'y a pas de données, la méthode est appelée et la valeur de retour de la méthode est placée dans le cache. @Cacheable注解主要是在方法执行前 先查看缓存中是否有数据。如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中。

    注解中的参数传递主要使用的是**SpEL(Spring Expression Language)**对数据进行获取传递,这有点类似于JSP中的EL表达式,常用方式如下几种:

    • “#p0”:获取参数列表中的第一个参数。其中的“#p”为固定写法,0为下标,代表第一个;

    • “#root.args[0]”:获取方法中的第一个参数。其中0为下标,代表第一个。

    • “#user.id”:获取参数 user 的 id 属性。注意的是这里的 user 必须要和参数列表中的参数名一致

    • “#result.id”:获取返回值中的 id 属性。

    来自Spring Cache源码:Spring Expression Language (SpEL) expression used for making the method

    @Cacheable注解中有几种常用的属性可进行需求性设置:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
     * @description 通过id获取用户信息
     * @author xBaozi
     * @date 14:23 2022/7/3
     **/
    @Cacheable(value = "userCache", key = "#id", unless = "#result == null")
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        User user = userService.getById(id);
        return user;
    }

    2.3、@CachePut

    @CachPut注解主要是将方法的返回值放到缓存中。这里同样是使用SpEL获取数据,常用的属性如下:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
     * @description 新增用户信息并返回保存的信息
     * @author xBaozi
     * @date 14:38 2022/7/3
     **/
    @CachePut(value = "userCache", key = "#user.id")
    @PostMapping
    public User save(User user) {
        userService.save(user);
        return user;
    }

    2.4、@CacheEvict

    @CacheeEvict主要是将一条或多条数据从缓存中删除,同样使用SpEL获取数据,常用的属性如下:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
     * @description 更新用户信息
     * @author xBaozi
     * @date 14:41 2022/7/3
     **/
    @CacheEvict(value = "userCache", key = "#result.id")
    @PutMapping
    public User update(User user) {
        userService.updateById(user);
        return user;
    }

    3、使用Redis当作缓存产品

    因为 Spring 默认的缓存技术无法持久化保存缓存数据,即服务挂了缓存也挂了,因此就需要使用Redis进行操作(其实也是因为学习了Redis)

    前面的SpringBoot整合Redis缓存验证码里面有记录着一些Redis的基本操作。

    3.1、坐标导入

    导入 maven 坐标:spring-boot-starter-data-redis、spring-boot-starter-cache

    <!--Spring Data Redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!--Spring Cache-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    3.2、yml配置

    spring:
      redis:
        host: localhost
        port: 6379
        password: 123456
        database: 0
        cache:
            redis:
                time-to-live: 1800000 # 设置缓存有效期

    3.3、开启注解功能

    在启动类 com/itheima/CacheDemoApplication.java

    Le transfert de paramètres dans les annotations utilise principalement **SpEL (Spring Expression Language)** pour obtenir et transférer des données. Ceci est quelque peu similaire aux expressions EL dans JSP. Les méthodes couramment utilisées sont les suivantes :

    "#p0" : Obtenez le premier paramètre de la liste des paramètres. Le "#p" est une méthode d'écriture fixe, et 0 est l'indice, représentant le premier

  • "#root.args[0]" : récupère le premier paramètre de la méthode ; Parmi eux, 0 est l’indice, qui représente le premier.

  • "#user.id" : Obtenez l'attribut id du paramètre user. Notez que l'utilisateur ici doit être cohérent avec le nom du paramètre dans la liste des paramètres

  • "#result.id": Obtenez l'attribut id dans la valeur de retour.

  • À partir du code source de Spring Cache : expression Spring Expression Language (SpEL) utilisée pour créer la méthode🎜🎜Il existe plusieurs attributs couramment utilisés dans l'annotation @Cacheable pour les exigences Paramètres des propriétés : 🎜
    • 🎜value : nom du cache, chaque nom de cache peut avoir plusieurs clés 🎜
    • 🎜key : clé de cache . 🎜
    • 🎜condition : jugement conditionnel, mettre en cache les données lorsque la condition est remplie. Il est à noter que ce paramètre n'est pas valide dans Redis🎜
    • 🎜Le paramètre "sauf si" peut être. utilisé dans Redis comme instruction conditionnelle pour éviter la mise en cache des données si une certaine condition est remplie.🎜
    @Slf4j
    @SpringBootApplication
    @ServletComponentScan
    @EnableCaching
    public class ReggieApplication {
        public static void main(String[] args) {
            SpringApplication.run(ReggieApplication.class, args);
            log.info("springBoot项目启动成功……");
        }
    }
    🎜2.3, l'annotation @CachePut🎜🎜@CachPut renvoie principalement la valeur de retour de la méthode Mettez-le dans le cache. SpEL est également utilisé pour obtenir des données ici. Les attributs couramment utilisés sont les suivants : 🎜
    • 🎜value : le nom du cache peut avoir plusieurs clés🎜.
    • 🎜key : clé mise en cache. 🎜
    • 🎜condition : jugement conditionnel, mettre en cache les données lorsque la condition est remplie. Il est à noter que ce paramètre n'est pas valide dans Redis🎜
    • 🎜Le paramètre "sauf si" peut être. utilisé dans Redis comme instruction conditionnelle pour éviter la mise en cache des données si une certaine condition est remplie.🎜
    /**
     * @description 新增套餐信息
     * @author xBaozi
     * @date 17:55 2022/5/13
     * @param setmealDto    需要新增套餐的数据
     **/
    @CacheEvict(value = "setmealCache",allEntries = true)
    @PostMapping
    public Result<String> save(@RequestBody SetmealDto setmealDto) {
        log.info("套餐信息为{}", setmealDto);
        setmealService.saveWithDish(setmealDto);
        return Result.success("套餐" + setmealDto.getName() + "新增成功");
    }
    🎜2.4, @CacheEvict🎜🎜@CacheeEvict met principalement en cache un ou plusieurs éléments de données Supprimez du cache et utilisez également SpEL pour obtenir des données. Les attributs couramment utilisés sont les suivants : 🎜
    • 🎜value : le nom du cache, chaque nom de cache. peut avoir plusieurs clés🎜
    • 🎜key : clé mise en cache. 🎜
    • 🎜condition : jugement conditionnel, mettre en cache les données lorsque la condition est remplie. Il est à noter que ce paramètre n'est pas valide dans Redis🎜
    • 🎜Le paramètre "sauf si" peut être. utilisé dans Redis comme instruction conditionnelle pour éviter la mise en cache des données si une certaine condition est remplie.🎜
    /**
     * @description 更新套餐信息并更新其关联的菜品
     * @author xBaozi
     * @date 11:28 2022/5/14
     * @param setmealDto    需要更新的套餐信息
     **/
    @CacheEvict(value = "setmealCache",allEntries = true)
    @PutMapping
    public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) {
        log.info(setmealDto.toString());
        setmealService.updateWithDish(setmealDto);
        return Result.success("套餐修改成功");
    }

    3 Utilisez Redis comme produit de mise en cache

    🎜Parce que la technologie de mise en cache par défaut de Spring est. non durable Les données mises en cache seront enregistrées automatiquement, même si le service est en panne, le cache sera également en panne, vous devez donc utiliser Redis pour le fonctionnement (en fait, c'est aussi parce que vous avez appris Redis) 🎜🎜Le SpringBoot précédent Le code de vérification du cache d'intégration Redis enregistre certaines opérations de base de Redis. 🎜🎜3.1, importation de coordonnées🎜🎜Importer les coordonnées maven : spring-boot-starter-data-redis, spring-boot-starter-cache🎜rrreee🎜3.2, configuration yml🎜
    🎜spring :
    redis : hôte : localhost
    port : 6379
    mot de passe : 123456
    base de données : 0
    cache :
    redis :
    durée de vie : 1800000 # Définissez la période de validité du cache🎜
    🎜3.3 Activez la fonction d'annotation🎜🎜Ajoutez l'annotation @EnableCaching à la classe de démarrage com/itheima/CacheDemoApplication.java pour activer la fonction d'annotation du cache🎜. rrreee🎜3.4. Utilisez @Cacheable🎜🎜Il convient de rappeler que lors de l'utilisation du cache, la valeur de retour doit implémenter l'interface de sérialisation Serialisable, sinon une erreur sera générée. 🎜🎜En effet, dans la base de données NoSql, il n'y a pas de structure de données correspondant à nos types de base Java, donc lors du stockage dans la base de données NoSql, nous devons sérialiser l'objet en même temps, nous devons faire attention à deux choses lors du réseau. transmission. Le SerialVersionUID des javabeans dans chaque application doit être cohérent, sinon la désérialisation ne peut pas être effectuée normalement. 🎜rrreee🎜3.5, en utilisant @CacheEvict🎜🎜Le nouvel attribut s'appelle allEntries, qui est un type booléen utilisé pour indiquer si tous les éléments du cache doivent être effacés. La valeur par défaut est false, ce qui signifie que ce n'est pas nécessaire. Si allEntries est défini sur true, Spring Cache ne prendra pas en compte la clé spécifiée. Parfois, il est plus efficace d'effacer et de mettre en cache tous les éléments en même temps plutôt que de les effacer un par un. 🎜
    /**
     * @description 更新套餐信息并更新其关联的菜品
     * @author xBaozi
     * @date 11:28 2022/5/14
     * @param setmealDto    需要更新的套餐信息
     **/
    @CacheEvict(value = "setmealCache",allEntries = true)
    @PutMapping
    public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) {
        log.info(setmealDto.toString());
        setmealService.updateWithDish(setmealDto);
        return Result.success("套餐修改成功");
    }

    4、测试

    代码编写完成之后,重启工程,然后访问后台管理系统,对套餐数据进行新增以及删除,而后观察Redis中的数据发现写的代码是能正常跑到!成功!

    Comment SpringBoot intègre Spring Cache pour implémenter la mise en cache Redis

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer