spring:
data:
redis:
database: 8
host: localhost
port: 6379
timeout: 60000
lettuce:
pool:
max-active: 1500
max-idle: 300
max-wait: -1ms
min-idle: 0
redis2:
database: 0
host: localhost
port: 6379
password:
package com.ys.conf;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.support.spring6.data.redis.GenericFastJsonRedisSerializer;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
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.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConf {
@Value("${spring.data.redis2.database}")
private Integer redis2DataBase;
@Value("${spring.data.redis2.host}")
private String redis2Localhost;
@Value("${spring.data.redis2.port}")
private Integer redis2Port;
@Value("${spring.data.redis2.password}")
private String redis2Password;
@Value("${spring.data.redis.timeout}")
private Integer timeout;
@Value("${spring.data.redis.lettuce.pool.max-active}")
private Integer maxActive;
@Value("${spring.data.redis.lettuce.pool.max-idle}")
private Integer maxIdle;
@Value("${spring.data.redis.lettuce.pool.max-wait}")
private String maxWait;
@Value("${spring.data.redis.lettuce.pool.min-idle}")
private Integer minIdle;
@Bean("redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
template.setDefaultSerializer(fastJsonRedisSerializer);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
FastRedisSerializer fastRedisSerializer = new FastRedisSerializer();
template.setHashValueSerializer(fastRedisSerializer);
return template;
}
@Bean("redis2")
public StringRedisTemplate redis2Template() {
return createStringRedisTemplate(this.redis2Localhost, this.redis2Port, this.redis2Password, this.redis2DataBase);
}
public StringRedisTemplate createStringRedisTemplate(String host, int port, String password, int database) {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(host);
configuration.setPort(port);
configuration.setDatabase(database);
if (ObjectUtils.isNotEmpty(password)) {
RedisPassword redisPassword = RedisPassword.of(password);
configuration.setPassword(redisPassword);
}
GenericObjectPoolConfig<?> genericObjectPoolConfig = new GenericObjectPoolConfig<>();
genericObjectPoolConfig.setMaxTotal(maxActive);
genericObjectPoolConfig.setMinIdle(minIdle);
genericObjectPoolConfig.setMaxIdle(maxIdle);
genericObjectPoolConfig.setMaxWait(Duration.ofMillis(60000));
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
builder.poolConfig(genericObjectPoolConfig);
builder.commandTimeout(Duration.ofSeconds(timeout));
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
connectionFactory.afterPropertiesSet();
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
class FastRedisSerializer extends GenericFastJsonRedisSerializer {
@Override
public byte[] serialize(Object object) throws SerializationException {
if (object == null) {
return new byte[0];
}
if (object instanceof Number) {
return JSON.toJSONBytes(object);
}
return super.serialize(object);
}
}