package com.zbkj.common.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; 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.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; import java.time.Duration; /** * Redis配置组件 */ @Configuration @EnableCaching public class RedisConfig { @Value("${spring.redis.host}") private String redisHost; @Value("${spring.redis.port}") private int redisPort; @Value("${spring.redis.password}") private String redisPass; @Value("${spring.redis.database}") private int redisDb; @Value("${spring.redis.timeout}") private String timeout; @Value("${spring.redis.jedis.pool.max-active}") private int maxTotal; @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; @Value("${spring.redis.jedis.pool.max-wait}") private int maxWaitMillis; @Value("${spring.redis.jedis.pool.time-between-eviction-runs}") private String timeBetweenEvictionRunsMillis; @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxTotal(maxTotal); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); jedisPoolConfig.setMinIdle(minIdle); jedisPoolConfig.setTimeBetweenEvictionRunsMillis(Integer.parseInt(timeBetweenEvictionRunsMillis)); return jedisPoolConfig; } @Bean public RedisConnectionFactory taskConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setPort(redisPort); redisStandaloneConfiguration.setHostName(redisHost); redisStandaloneConfiguration.setDatabase(redisDb); redisStandaloneConfiguration.setPassword(redisPass); //获得默认的连接池构造 //这里需要注意的是,RedisConnectionFactoryJ对于Standalone模式的没有(RedisStandaloneConfiguration,jedisPoolConfig)的构造函数,对此 //我们用JedisClientConfiguration接口的builder方法实例化一个构造器,还得类型转换 JedisClientConfiguration.DefaultJedisClientConfigurationBuilder jpConfigBuilder = (JedisClientConfiguration.DefaultJedisClientConfigurationBuilder) JedisClientConfiguration.builder(); //修改我们的连接池配置 jpConfigBuilder.usePooling(); jpConfigBuilder.poolConfig(jedisPoolConfig()); jpConfigBuilder.readTimeout(Duration.ofMillis(Integer.parseInt(timeout))); jpConfigBuilder.connectTimeout(Duration.ofMillis(Integer.parseInt(timeout))); //通过构造器来构造jedis客户端配置 JedisClientConfiguration jedisClientConfiguration = jpConfigBuilder.build(); //配置连接池属性 // jedisConnectionFactory.setTimeout(Integer.parseInt(timeout)); return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration); } /** * redisTemplate相关配置 * * @param redisConnectionFactory redis链接工厂 */ @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { //配置redisTemplate RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 使用StringRedisSerializer来序列化和反序列化redis的key值 StringRedisSerializer stringSerializer = new StringRedisSerializer(); // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = serializer(); redisTemplate.setKeySerializer(stringSerializer);//key序列化 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value序列化 redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 redisTemplate.afterPropertiesSet(); return redisTemplate; } /** * 配置Jackson2JsonRedisSerializer序列化策略 */ private Jackson2JsonRedisSerializer serializer() { //设置序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); // 不存在的字段,不被序列化 om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jackson2JsonRedisSerializer.setObjectMapper(om); return jackson2JsonRedisSerializer; } }