Rumah  >  Artikel  >  pangkalan data  >  Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

王林
王林ke hadapan
2023-05-28 20:59:121448semak imbas

Mula-mula kita perlu mengkonfigurasi pengurus cache, dan kemudian kita boleh menggunakan anotasi cache untuk mengurus cache

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;
    }
}

1 @Cacheable

ditandakan pada kaedah atau kelas untuk mengenal pasti perkara itu kaedah atau kelas menyokongnya cache. Selepas Spring memanggil kaedah pengenalan anotasi, nilai pulangan akan dicache dalam redis untuk memastikan bahawa pada kali seterusnya kaedah dipanggil dengan keadaan yang sama, nilai pulangan akan diperoleh terus daripada cache. Dengan cara ini, tidak perlu melaksanakan semula proses pemprosesan perniagaan kaedah ini, yang meningkatkan kecekapan.

Tiga parameter @Cacheable yang biasa digunakan adalah seperti berikut:

nama cacheNames cache
kunci cache kunci, anda perlu memberi perhatian kepada cara kunci ditulis
keadaan keadaan untuk pelaksanaan cache, apabila benar dikembalikan Perlaksanaan

Contoh

    //查询所有用户,缓存到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);
    }

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Pertanyaan pertama disoal dari pangkalan data dan kemudian dicache ke dalam redis alat untuk melihat maklumat cache

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Pertanyaan kedua pergi ke konsol cache dan tiada output, jadi cache redis adalah untuk mendapatkan hasil dalam redis dan mengembalikannya terus .

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

@CacheEvict

ditandakan pada kaedah Selepas kaedah dilaksanakan, cache yang sepadan akan dipadamkan berdasarkan syarat atau kunci. Atribut yang biasa digunakan:

  • allEntries jenis boolean, menunjukkan sama ada semua elemen dalam cache perlu dikosongkan

  • kunci Kekunci cache yang perlu dipadamkan

 //调用这个接口结束后,删除指定的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);
    }
rrree

Apabila kami mengemas kini data dalam pangkalan data, kami perlu mengosongkan cache redis. Jika tidak, data yang kami tanya ialah data dalam cache redis, yang akan menyebabkan ketidakkonsistenan antara pangkalan data dan data cache.

Contoh: Panggil antara muka tanpa anotasi @CacheEvict untuk mengubah suai data Data yang diperoleh dalam pertanyaan adalah sebelum pengubahsuaian.

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Jadi apabila kami memanggil antara muka untuk mengubah suai data, kami perlu mengosongkan cache

Tambahkan anotasi @CacheEvict untuk mengosongkan cache yang sepadan masa, kami menanyakan data dan menemui data itu adalah yang terkini dan konsisten dengan pangkalan data.

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Masa tamat tempoh

Kami telah melaksanakan fungsi asas Spring Cache, menyepadukan Redis sebagai RedisCacheManger, tetapi seperti yang kita semua tahu, kami menggunakan @Cacheable Apabila membuat anotasi, anda tidak boleh memberikan masa tamat tempoh kepada cache. Tetapi kadangkala dalam beberapa senario kita benar-benar perlu memberikan masa tamat tempoh kepada cache! Ini ialah masa tamat tempoh lalai

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Masa kesahihan data

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Masa tamat tempoh tersuai

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Gunakan konfigurasi redis baharu dan tanya data cache sekali lagi untuk melihat tempoh sah data

Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis

Atas ialah kandungan terperinci Cara menggunakan @Cacheable dalam penyepaduan springboot dan redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam