springboot 2.4.5 redis 配置類+緩存


package com.anquan.Configeration;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
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.connection.jedis.JedisConnectionFactory;
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 RedisConfiger extends CachingConfigurerSupport {

    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
    /
**添加對應依賴 JedisConnectionFactory,LettLettuceConnectionFactory
     *RedisConnectionFactory工廠又兩種方式創建類 :
   * JedisConnectionFactory()
   * LettLettuceConnectionFactory 
   */

return new JedisConnectionFactory();
 } /** * 實例化RedisTemplate類 */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { //大多數情況,都是選用<String, Object> RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 使用JSON的序列化對象,對數據key和value進行序列化轉換 Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); //ObjectMapper是Jackson的一個工作類,顧名思義他的作用是將JSON映射到Java對象即反序列化,或將Java對象映射到JSON即序列化 ObjectMapper mapper = new ObjectMapper(); // 設置序列化時的可見性,第一個參數是選擇序列化哪些屬性,比如時序列化setter?還是filed?h第二個參數是選擇哪些修飾符權限的屬性來序列化,比如private或者public,這里的any是指對所有權限修飾的屬性都可見(可序列化)  mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 設置出現故障即錯誤的類型,第一個是指驗證程序,此時的參數為無需驗證,其他參數可以查看源碼了解(作者還在啃源碼中),第二是指該類不能為final修飾,否則將會報錯  mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(mapper); // 設置RedisTemplate模板的序列化方式為jacksonSeial  template.setDefaultSerializer(jackson2JsonRedisSerializer); return template; } /** * 自定義緩存管理器 * @param redisConnectionFactory * @return */ @Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // 創建String和JSON序列化對象,分別對key和value的數據進行類型轉換 RedisSerializer<String> strSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(mapper); // 自定義緩存數據序列化方式和有效期限 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofDays(1)) // 設置緩存有效期為1天 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(strSerializer)) // 使用strSerializer對key進行數據類型轉換 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial)) // 使用jacksonSeial對value的數據類型進行轉換 .disableCachingNullValues(); // 對空數據不操作  RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build(); return cacheManager; } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM