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.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 public class RedisConfig extends CachingConfigurerSupport { //JSON序列化 public RedisSerializer<Object> jackson2JsonRedisSerializer() { //jackson2JsonRedisSerializer来序列化和反序列化redis的value值 Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); return jackson2JsonRedisSerializer; } //Redis缓存序列化 @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { //生成一个默认配置,通过config对象即可对缓存进行自定义配置 RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); redisCacheConfiguration = redisCacheConfiguration //设置key为string序列化 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) //设置value为json序列化 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer())) //不缓存空值 会覆盖yml配置文件中缓存配置 .disableCachingNullValues() //设置缓存的默认过期时间 30分钟 会覆盖yml配置文件中缓存配置 .entryTtl(Duration.ofMinutes(30L)); //特殊缓存空间应用不同的配置 //Map<String,RedisCacheConfiguration> map = new HashMap<>(); //map.put("bill_1",redisCacheConfiguration.entryTtl(Duration.ofSeconds(30L))); //bill_1缓存空间过期时间 30秒 //map.put("bill_2",redisCacheConfiguration.entryTtl(Duration.ofHours(1L))); //bill_2缓存空间过期时间 1小时 //使用自定义的缓存配配置初始化一个RedisCacheManager RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory) //默认配置 .cacheDefaults(redisCacheConfiguration) //特殊缓存 //.withInitialCacheConfigurations(map) //事务 .transactionAware() .build(); return redisCacheManager; } //RedisTemplate序列化 @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); //key采用String的序列化方式 redisTemplate.setKeySerializer(stringRedisSerializer); //hash的key也采用String的序列化方式 redisTemplate.setHashKeySerializer(stringRedisSerializer); //value序列化方式采用jackson redisTemplate.setValueSerializer(jackson2JsonRedisSerializer()); //hash的value序列化方式采用jackson redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }