Heim > Datenbank > Redis > Hauptteil

So verwenden Sie @Cacheable bei der Integration von Springboot und Redis

王林
Freigeben: 2023-05-28 20:59:12
nach vorne
1479 Leute haben es durchsucht

Zuerst müssen wir einen Cache-Manager konfigurieren, und dann können wir Cache-Annotationen verwenden, um den Cache zu verwalten.

package com.cherish.servicebase.handler;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration
                .defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
             // 可以给每个cacheName不同的RedisCacheConfiguration  设置不同的过期时间
            //.withCacheConfiguration("Users",config.entryTtl(Duration.ofSeconds(100)))
                .transactionAware()
                .build();
        return cacheManager;
    }
}
Nach dem Login kopieren

1, @Cacheable

ist in der Methode markiert oder Klasse und der Bezeichner. Diese Methode oder Klasse unterstützt Caching. Nachdem Spring die Annotationsidentifizierungsmethode aufgerufen hat, wird der Rückgabewert in Redis zwischengespeichert, um sicherzustellen, dass der Rückgabewert beim nächsten Aufruf der Methode unter denselben Bedingungen direkt aus dem Cache abgerufen wird. Auf diese Weise ist es nicht erforderlich, den Geschäftsverarbeitungsprozess dieser Methode erneut auszuführen, was die Effizienz verbessert.

@Cacheable Die drei häufig verwendeten Parameter lauten wie folgt:

cacheNames Cache-Name
Schlüssel zwischengespeicherter Schlüssel, Sie müssen auf die Schreibweise des Schlüssels achten # 🎜🎜#Ausführung des Bedingungscaches Die Bedingung wird ausgeführt, wenn true zurückgegeben wird. Verwenden Sie das Redis-Visualisierungstool in Redis, um zwischengespeicherte Informationen anzuzeigen.

Die zweite Abfrage Geht zur Cache-Konsole und es gibt keine Ausgabe, also ist der Redis-Cache in redis Holen Sie sich das Ergebnis und geben Sie es direkt zurück. So verwenden Sie @Cacheable bei der Integration von Springboot und Redis

@CacheEvictSo verwenden Sie @Cacheable bei der Integration von Springboot und Redis

wird auf der Methode markiert, der entsprechende Cache wird basierend auf gelöscht die Bedingung oder der Schlüssel. Häufig verwendete Attribute:

So verwenden Sie @Cacheable bei der Integration von Springboot und RedisallEntries boolescher Typ, der angibt, ob alle Elemente im Cache gelöscht werden müssen

#🎜🎜 #key Der zwischengespeicherte Schlüssel, der gelöscht werden muss

        //查询所有用户,缓存到redis中
        @GetMapping("/selectFromRedis")
        @Cacheable(cacheNames = "Users",key = "&#39;user&#39;")
        public ResultData getUserRedis(){
            List<User> list = userService.list(null);
            return ResultData.ok().data("User",list);
        }
    Nach dem Login kopieren
     //调用这个接口结束后,删除指定的Redis缓存
        @PostMapping("updateUser")
        @CacheEvict(cacheNames ="Users",key = "&#39;user&#39;")
        public ResultData updateUser(@RequestBody User user){
            String id = user.getId();
            QueryWrapper<User> wrapper=new QueryWrapper<>();
            wrapper.eq("id",id);
            boolean b = userService.update(user, wrapper);
            return ResultData.ok().data("flag",b);
        }
    Nach dem Login kopieren
  • Wenn wir die Daten in der Datenbank aktualisieren, müssen wir den Redis-Cache leeren. Andernfalls handelt es sich bei den von uns abgefragten Daten um Daten im Redis-Cache, was zu Inkonsistenzen zwischen der Datenbank und den zwischengespeicherten Daten führt.

    Beispiel: Rufen Sie die Schnittstelle ohne @CacheEvict-Annotation auf, um die Daten zu ändern. Die in der Abfrage erhaltenen Daten liegen vor der Änderung.
  • Wenn wir also die Schnittstelle aufrufen, um Daten zu ändern, müssen wir den Cache leeren

    Fügen Sie die Annotation @CacheEvict zum Löschen hinzu der entsprechende Cache Zu diesem Zeitpunkt wird beim Abfragen der Daten festgestellt, dass die Daten die neuesten sind und mit der Datenbank übereinstimmen.

    So verwenden Sie @Cacheable bei der Integration von Springboot und RedisAblaufzeit

    Wir haben die Grundfunktionen von Spring Cache implementiert und Redis als

    mit Anmerkungen versehen Manchmal ist es so Es ist unmöglich, dem Cache eine Ablaufzeit zu geben. Aber manchmal müssen wir in manchen Szenarien dem Cache wirklich eine Ablaufzeit geben! Dies ist das Standardablaufdatum. Definieren Sie die Ablaufzeit

    So verwenden Sie @Cacheable bei der Integration von Springboot und Redis

    Verwenden Sie die neue Redis-Konfiguration und fragen Sie die zwischengespeicherten Daten erneut ab, um den Gültigkeitszeitraum der Daten anzuzeigen#🎜🎜 #

    # 🎜🎜#

    Das obige ist der detaillierte Inhalt vonSo verwenden Sie @Cacheable bei der Integration von Springboot und Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!