package com.panzhihua.common.redis;
|
|
import java.time.Duration;
|
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import org.springframework.cache.CacheManager;
|
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 com.fasterxml.jackson.annotation.JsonAutoDetect;
|
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
/**
|
* program 攀枝花智慧社区项目 缓存配置类
|
*
|
* @author manailin Date 2021-08-27 15:30
|
**/
|
@Configuration
|
public class CacheConfig {
|
|
private Duration timeToLive = Duration.ofHours(1);
|
|
@Bean
|
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
|
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
|
redisTemplate.setConnectionFactory(redisConnectionFactory);
|
|
// 使用Jackson2JsonRedisSerialize 替换默认序列化
|
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
|
|
objectMapper.activateDefaultTyping(
|
objectMapper.getPolymorphicTypeValidator(),
|
ObjectMapper.DefaultTyping.NON_FINAL,
|
JsonTypeInfo.As.PROPERTY);
|
|
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
|
|
// 设置value的序列化规则和 key的序列化规则
|
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
|
redisTemplate.setKeySerializer(new StringRedisSerializer());
|
redisTemplate.afterPropertiesSet();
|
return redisTemplate;
|
}
|
|
@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);
|
|
// 配置序列化(解决乱码的问题)
|
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(timeToLive)
|
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
|
.serializeValuesWith(
|
RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
|
.disableCachingNullValues();
|
RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();
|
|
return cacheManager;
|
}
|
}
|