importorg.apache.commons.pool2.impl.GenericObjectPoolConfig;importorg.springframework.boot.autoconfigure.data.redis.RedisProperties;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.connection.RedisNode;importorg.springframework.data.redis.connection.RedisSentinelConfiguration;importorg.springframework.data.redis.connection.RedisServer;importorg.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;importorg.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;importorg.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.data.redis.serializer.RedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;importjava.time.Duration;importjava.util.List;/*** redis配置类*/@EnableConfigurationProperties(RedisProperties.class)
@Configurationpublic classRedisConfig {private finalRedisProperties properties;publicRedisConfig(RedisProperties properties) {this.properties =properties;
}
@Bean(name= "StringRedisTemplate")publicStringRedisTemplate stringRedisTemplate() {
StringRedisTemplate redisTemplate= newStringRedisTemplate();
RedisSerializer stringSerializer = newStringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
redisTemplate.setConnectionFactory(getConnectionFactory());returnredisTemplate;
}
@BeanpublicRedisConnectionFactory getConnectionFactory() {//哨兵模式
RedisSentinelConfiguration configuration = newRedisSentinelConfiguration();
configuration.setMaster(properties.getSentinel().getMaster());
configuration.setPassword(properties.getPassword());
configuration.setDatabase(properties.getDatabase());
List nodes =properties.getSentinel().getNodes();
nodes.forEach(node->{
String[] str= node.split(":");
RedisNode redisServer= new RedisServer(str[0], Integer.parseInt(str[1]));
configuration.sentinel(redisServer);
});
LettuceConnectionFactory factory= newLettuceConnectionFactory(configuration, getPool());//使用前先校验连接,这个最好是要配置:不然会带来connection reset by peer
factory.setValidateConnection(true);returnfactory;
}
@BeanpublicLettuceClientConfiguration getPool() {
GenericObjectPoolConfig genericObjectPoolConfig= newGenericObjectPoolConfig();//redis客户端配置:超时时间默认
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
builder=LettucePoolingClientConfiguration.builder().
commandTimeout(Duration.ofMillis(60000));//链接池配置
RedisProperties.Pool pool =properties.getLettuce().getPool();
genericObjectPoolConfig.setMaxIdle(pool.getMaxIdle());
genericObjectPoolConfig.setMinIdle(pool.getMinIdle());
genericObjectPoolConfig.setMaxTotal(pool.getMaxActive());
genericObjectPoolConfig.setMaxWaitMillis(pool.getMaxWait().toMillis());
builder.shutdownTimeout(Duration.ofMillis(4000));
builder.poolConfig(genericObjectPoolConfig);returnbuilder.build();
}
}