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; } }
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 = "'user'") public ResultData getUserRedis(){ List<User> list = userService.list(null); return ResultData.ok().data("User",list); }
Pertanyaan pertama disoal dari pangkalan data dan kemudian dicache ke dalam redis alat untuk melihat maklumat cache
Pertanyaan kedua pergi ke konsol cache dan tiada output, jadi cache redis adalah untuk mendapatkan hasil dalam redis dan mengembalikannya terus .
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 = "'user'") 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); }
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.
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.
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
Masa kesahihan data
Masa tamat tempoh tersuai
Gunakan konfigurasi redis baharu dan tanya data cache sekali lagi untuk melihat tempoh sah data
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!