Heim  >  Artikel  >  Datenbank  >  Wie SpringBoot Spring Cache integriert, um Redis-Caching zu implementieren

Wie SpringBoot Spring Cache integriert, um Redis-Caching zu implementieren

PHPz
PHPznach vorne
2023-05-27 08:47:111216Durchsuche

    1. Einführung

    Spring Cache ist ein Framework, das eine annotationsbasierte Caching-Funktion implementiert Eine Anmerkung kann die Caching-Funktion realisieren.

    Spring Cache bietet eine Abstraktionsebene, und die unterste Ebene kann verschiedene Cache-Implementierungen wechseln.

    Insbesondere werden verschiedene Caching-Technologien über die CacheManager-Schnittstelle vereinheitlicht.

    CacheManager ist eine abstrakte Schnittstelle für verschiedene Caching-Technologien, die von Spring bereitgestellt wird. Dies ist die Standard-Caching-Technologie und wird in Map zwischengespeichert. Dies bedeutet auch, dass die zwischengespeicherten Daten verloren gehen. .

    Für unterschiedliche Caching-Technologien müssen verschiedene CacheManager implementiert werden 🎜#

    #🎜 🎜## 🎜 🎜#GuavaCacheManagerVerwendung von Googles GuavaCache als Caching-TechnologieVerwendung von Redis als Caching-Technologie# 🎜 🎜 #Um in einem Spring Boot-Projekt die Caching-Technologie zu verwenden, müssen Sie nur die Abhängigkeiten der relevanten Elemente importieren Fügen Sie die Caching-Technologie in das Projektpaket ein und verwenden Sie für die Startup-Klasse, um die Cache-Unterstützung zu aktivieren. Um beispielsweise Redis als Caching-Technologie zu verwenden, müssen Sie nur die Maven-Koordinaten von Spring Data Redis importieren. Häufig verwendete Anmerkungen sind wie folgt: Annotation
    EhCacheCacheManager EhCache als Caching-Technologie verwenden
    RedisCacheManager
    2. Allgemeine Anmerkungen
    Description

    # ?? 🎜 #Bevor die Methode ausgeführt wird, prüft Spring zunächst, ob Daten im Cache vorhanden sind. Wenn keine Daten vorhanden sind, ruft es die Methode auf und legt den Rückgabewert der Methode im Cache ab. @EnableCaching

    #🎜 🎜#@CachePutLegen Sie den Rückgabewert der Methode in den Cache.#🎜🎜 #Ein oder mehrere Daten aus dem Cache löschen

    2.1, @EnableCaching

    Die Hauptfunktion dieser Annotation besteht darin, die Cache-Annotationsfunktion zu aktivieren und andere Spring Cache-Annotationen wirksam zu machen. Die Verwendung ist ebenfalls sehr einfach. Fügen Sie sie einfach direkt über der Startklasse des Projekts hinzu.

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

    2.2, @Cacheable

    @Cacheable Annotation dient hauptsächlich dazu, vor dem Ausführen der Methode zu prüfen, ob sich Daten im Cache befinden. Wenn Daten vorhanden sind, werden die zwischengespeicherten Daten direkt zurückgegeben. Wenn keine Daten vorhanden sind, wird die Methode aufgerufen und der Rückgabewert der Methode im Cache abgelegt. @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

    Die Parameterübertragung in Anmerkungen verwendet hauptsächlich **SpEL (Spring Expression Language)**, um Daten zu erhalten und zu übertragen. Dies ähnelt in gewisser Weise den EL-Ausdrücken in JSP. #🎜🎜 #
    • "#p0": Ruft den ersten Parameter in der Parameterliste ab. Das „#p“ ist eine feste Schreibmethode, 0 ist der Index, der den ersten darstellt; 1 in der Methode ein Parameter. Unter diesen ist 0 der Index, der den ersten darstellt.

    • "#user.id": Ruft das ID-Attribut des Parameterbenutzers ab. Beachten Sie, dass der Benutzer hier mit dem Parameternamen in der Parameterliste übereinstimmen muss

    • "#result.id": Holen Sie sich das ID-Attribut im Rückgabewert.

    Aus Spring Cache-Quellcode: Spring Expression Language (SpEL)-Ausdruck, der zum Erstellen der Methode

    in @Cacheable verwendet wird code >Es gibt mehrere häufig verwendete Attribute in der Annotation, die bei Bedarf festgelegt werden können:

    • #🎜🎜#value: Der Name des Caches, der finden Sie unter jedem Cache-Namen. Es gibt mehrere Schlüssel#🎜🎜#
    • #🎜🎜#key: zwischengespeicherter Schlüssel. #🎜🎜#
    • #🎜🎜#Bedingung: Bedingte Beurteilung, Daten zwischenspeichern, wenn die Bedingung erfüllt ist. Es ist erwähnenswert, dass dieser Parameter in Redis ungültig ist #🎜🎜#
    • # 🎜🎜#Der Parameter „unless“ kann in Redis als bedingte Anweisung verwendet werden, um das Zwischenspeichern von Daten zu vermeiden, wenn eine bestimmte Bedingung erfüllt ist.#🎜🎜#
    @Slf4j
    @SpringBootApplication
    @ServletComponentScan
    @EnableCaching
    public class ReggieApplication {
        public static void main(String[] args) {
            SpringApplication.run(ReggieApplication.class, args);
            log.info("springBoot项目启动成功……");
        }
    }
    #🎜🎜#2.3、@ CachePut# 🎜🎜##🎜🎜#@CachPut-Annotation legt hauptsächlich den Rückgabewert der Methode im Cache ab. SpEL wird hier auch zum Abrufen von Daten verwendet. Die häufig verwendeten Attribute sind wie folgt: #🎜🎜#
    • #🎜🎜#value: Der Name des Caches Name kann mehrere Werte haben. key#🎜🎜#
    • #🎜🎜#key: zwischengespeicherter Schlüssel. #🎜🎜#
    • #🎜🎜#Bedingung: Bedingte Beurteilung, Daten zwischenspeichern, wenn die Bedingung erfüllt ist. Es ist erwähnenswert, dass dieser Parameter in Redis ungültig ist #🎜🎜#
    • # 🎜🎜#Der Parameter „unless“ kann in Redis als bedingte Anweisung verwendet werden, um das Zwischenspeichern von Daten zu vermeiden, wenn eine bestimmte Bedingung erfüllt ist.#🎜🎜#
    /**
     * @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 Löscht hauptsächlich ein oder mehrere Daten aus dem Cache. Die häufig verwendeten Attribute sind wie folgt: #🎜🎜#
    • #🎜🎜#Wert: Der Name des Caches. Unter jedem Cache-Namen können mehrere Schlüssel vorhanden sein #🎜🎜#
    • #🎜🎜 #key: Der Cache-Schlüssel. #🎜🎜#
    • #🎜🎜#Bedingung: Bedingte Beurteilung, Daten zwischenspeichern, wenn die Bedingung erfüllt ist. Es ist erwähnenswert, dass dieser Parameter in Redis ungültig ist #🎜🎜#
    • # 🎜🎜#Der Parameter „unless“ kann in Redis als bedingte Anweisung verwendet werden, um das Zwischenspeichern von Daten zu vermeiden, wenn eine bestimmte Bedingung erfüllt ist.#🎜🎜#
    /**
     * @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. Verwenden Sie Redis als Caching-Produkte

    #🎜🎜#Da die Standard-Caching-Technologie von Spring die Cache-Daten nicht beibehalten kann, bleibt der Cache hängen, selbst wenn der Dienst hängt, sodass Sie Redis für den Betrieb verwenden müssen (tatsächlich liegt dies auch daran, dass Sie haben Redis gelernt)#🎜🎜 ##🎜🎜#Der vorherige SpringBoot-integrierte Redis-Cache-Verifizierungscode zeichnet einige grundlegende Vorgänge von Redis auf. #🎜🎜##🎜🎜#3.1, Koordinatenimport#🎜🎜##🎜🎜#Maven-Koordinaten importieren: spring-boot-starter-data-redis, spring-boot-starter-cache#🎜🎜#rrreee#🎜🎜# 3.2. yml-Konfiguration#🎜🎜#
    #🎜🎜#spring:
    redis:
    host: localhost
    port: 6379
    passwort: 123456
    datenbank: 0
    Cache:
    Redis:
    Lebensdauer: 1800000 #Cache-Gültigkeitszeitraum festlegen#🎜🎜#
    #🎜🎜#3.3. Anmerkungsfunktion aktivieren#🎜🎜# # 🎜🎜#Fügen Sie die @EnableCaching-Annotation zur Startklasse com/itheima/CacheDemoApplication.java hinzu, um die Cache-Annotationsfunktion zu aktivieren#🎜🎜#rrreee#🎜🎜#3.4, verwenden Sie @Cacheable#🎜🎜 ##🎜 🎜#Es sollte daran erinnert werden, dass bei Verwendung des Caches der Rückgabewert die Serializable-Serialisierungsschnittstelle implementieren muss, andernfalls wird ein Fehler ausgegeben. #🎜🎜##🎜🎜#Dies liegt daran, dass es in der NoSql-Datenbank keine Datenstruktur gibt, die unseren Java-Grundtypen entspricht. Daher müssen wir beim Speichern in der NoSql-Datenbank das Objekt serialisieren und über das Netzwerk übertragen Beachten Sie, dass die serialVersionUID der Javabean in den beiden Anwendungen konsistent sein muss, da sonst die Deserialisierung nicht normal durchgeführt werden kann. #🎜🎜#rrreee#🎜🎜#3.5, verwenden Sie @CacheEvict#🎜🎜##🎜🎜#Das neue Attribut heißt allEntries, ein boolescher Typ, der angibt, ob alle Elemente im Cache gelöscht werden müssen. Der Standardwert ist false, was bedeutet, dass er nicht benötigt wird. Wenn allEntries auf true gesetzt ist, berücksichtigt Spring Cache den angegebenen Schlüssel nicht. Manchmal ist es effizienter, alle Elemente auf einmal zu löschen und zwischenzuspeichern, als Elemente einzeln zu löschen. #🎜🎜#
    /**
     * @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中的数据发现写的代码是能正常跑到!成功!

    Wie SpringBoot Spring Cache integriert, um Redis-Caching zu implementieren

    #🎜 🎜#@CacheEvict

    Das obige ist der detaillierte Inhalt vonWie SpringBoot Spring Cache integriert, um Redis-Caching zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen