package com.xxxx.demo;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.*;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate getRedisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate template =new RedisTemplate();
//Object.class在反序列化的时候不设置ObjectMapper 会生成linkedHashMap类型 返回纯json数据
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping( LaissezFaireSubTypevalidator.instance ,ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//为string类型的key设置序列化器
template.setKeySerializer(new StringRedisSerializer());
//为string类型的values设置序列化器
template.setValueSerializer(jackson2JsonRedisSerializer);
//为hash类型的key设置序列化器
template.setHashKeySerializer(new StringRedisSerializer());
//为hash类型的values设置序列化器
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setConnectionFactory(redisConnectionFactory); //必须添加 redis工厂
return template;
}
//缓存配置管理器
@Bean
public RedisCacheManager cacheManager (RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(7)) // 设置缓存过期时间
// .disableCachingNullValues() // 禁用缓存空值,不缓存null校验
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
// 注意GenericJackson2JsonRedisSerializer反序列化时没有类型
// 正常应使用自定义的序列化器
.serializevaluesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
//cacheDefaults必须第一个配置 否则运行默认配置
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(redisCacheConfiguration).build(); // 设置默认的cache组件
}
}
yml中redis简单配置
spring:
redis:
timeout: 10000 #连接超时时间
host: ######### #redis的服务地址
port: 6379 #redis端口号
password: root #redis服务器密码
database: 0 #选择哪个库 默认为0库
lettuce:
pool:
max-active: 1024 #最大连接数 默认为8
max-idle: 200 #最大空闲连接 默认为8
max-wait: 10000 #最大连接阻塞等待时间 单位毫秒 默认为-1 不限制
min-idle: 5 #最小空闲默认为0



