fix(uboot-common): 修改redis配置类动态配置db

This commit is contained in:
chuhang
2021-12-27 13:57:59 +08:00
parent 164c034d4c
commit 414a3a0c22
3 changed files with 67 additions and 5 deletions

View File

@ -6,18 +6,29 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.util.StringUtils;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;
import static java.util.stream.Collectors.toList;
/** /**
* redis 配置 * redis 配置
@ -25,12 +36,58 @@ import java.nio.charset.StandardCharsets;
* @author dino * @author dino
* @date 2021/2/19 19:29 * @date 2021/2/19 19:29
*/ */
@Configuration @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class) @ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class) @EnableConfigurationProperties(RedisProperties.class)
@RequiredArgsConstructor
public class RedisLettuceConfig { public class RedisLettuceConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { private final RedisProperties redisProperties;
@Bean("idempotentRedisTemplate")
@ConditionalOnProperty(name = "spring.redis.database.idempotent")
public RedisTemplate<String, Object> idempotentRedisTemplate(@Value("${spring.redis.database.idempotent}") int idempotentDatabase) {
return this.redisTemplate(this.getLettuceConnectionFactory(idempotentDatabase));
}
@Bean("shardingRedisTemplate")
@ConditionalOnProperty(name = "spring.redis.database.sharding")
public RedisTemplate<String, Object> shardingRedisTemplate(@Value("${spring.redis.database.sharding}") int shardingDatabase) {
return this.redisTemplate(this.getLettuceConnectionFactory(shardingDatabase));
}
@Bean("cacheRedisTemplate")
@ConditionalOnProperty(name = "spring.redis.database.cache")
public RedisTemplate<String, Object> cacheRedisTemplate(@Value("${spring.redis.database.cache}") int cacheDatabase) {
return this.redisTemplate(this.getLettuceConnectionFactory(cacheDatabase));
}
@Bean("backupRedisTemplate")
@ConditionalOnProperty(name = "spring.redis.database.backup")
public RedisTemplate<String, Object> backupRedisTemplate(@Value("${spring.redis.database.backup}") int backupDatabase) {
return this.redisTemplate(this.getLettuceConnectionFactory(backupDatabase));
}
private LettuceConnectionFactory getLettuceConnectionFactory(Integer db) {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(this.sentinelConfig());
lettuceConnectionFactory.setDatabase(db);
lettuceConnectionFactory.afterPropertiesSet();
return lettuceConnectionFactory;
}
private RedisSentinelConfiguration sentinelConfig() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration();
sentinelConfig.setMaster(redisProperties.getSentinel().getMaster());
List<RedisNode> nodes = redisProperties.getSentinel().getNodes().stream().map(hostAndPort -> {
String[] args = StringUtils.split(hostAndPort, ":");
return new RedisNode(Objects.requireNonNull(args)[0], Integer.parseInt(args[1]));
}).collect(toList());
sentinelConfig.setSentinels(nodes);
sentinelConfig.setPassword(redisProperties.getPassword());
return sentinelConfig;
}
private RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory); template.setConnectionFactory(factory);

View File

@ -14,6 +14,7 @@ import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -34,7 +35,8 @@ import java.util.concurrent.TimeUnit;
@Aspect @Aspect
public class IdempotentAspect { public class IdempotentAspect {
@Autowired @Autowired(required = false)
@Qualifier("idempotentRedisTemplate")
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
/**redis键值*/ /**redis键值*/

View File

@ -19,6 +19,7 @@ import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
@ -45,7 +46,9 @@ public class RequestShardValueAspect {
private KeyResolver keyResolver; private KeyResolver keyResolver;
@Autowired @Autowired
private ProcessService processService; private ProcessService processService;
@Autowired
@Autowired(required = false)
@Qualifier("shardingRedisTemplate")
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;