diff --git a/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/config/RedisLettuceConfig.java b/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/config/RedisLettuceConfig.java index 17ee44e..57cd2e4 100644 --- a/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/config/RedisLettuceConfig.java +++ b/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/config/RedisLettuceConfig.java @@ -6,18 +6,29 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; 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.ConditionalOnProperty; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; 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.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.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.util.StringUtils; import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Objects; + +import static java.util.stream.Collectors.toList; /** * redis 配置 @@ -25,12 +36,58 @@ import java.nio.charset.StandardCharsets; * @author dino * @date 2021/2/19 19:29 */ -@Configuration +@Configuration(proxyBeanMethods = false) @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) +@RequiredArgsConstructor public class RedisLettuceConfig { - @Bean - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + + private final RedisProperties redisProperties; + + @Bean("idempotentRedisTemplate") + @ConditionalOnProperty(name = "spring.redis.database.idempotent") + public RedisTemplate idempotentRedisTemplate(@Value("${spring.redis.database.idempotent}") int idempotentDatabase) { + return this.redisTemplate(this.getLettuceConnectionFactory(idempotentDatabase)); + } + + @Bean("shardingRedisTemplate") + @ConditionalOnProperty(name = "spring.redis.database.sharding") + public RedisTemplate shardingRedisTemplate(@Value("${spring.redis.database.sharding}") int shardingDatabase) { + return this.redisTemplate(this.getLettuceConnectionFactory(shardingDatabase)); + } + + @Bean("cacheRedisTemplate") + @ConditionalOnProperty(name = "spring.redis.database.cache") + public RedisTemplate cacheRedisTemplate(@Value("${spring.redis.database.cache}") int cacheDatabase) { + return this.redisTemplate(this.getLettuceConnectionFactory(cacheDatabase)); + } + + @Bean("backupRedisTemplate") + @ConditionalOnProperty(name = "spring.redis.database.backup") + public RedisTemplate 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 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 redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(factory); diff --git a/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/idempotent/aspect/IdempotentAspect.java b/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/idempotent/aspect/IdempotentAspect.java index f87ba9f..788772d 100644 --- a/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/idempotent/aspect/IdempotentAspect.java +++ b/uboot-common/src/main/java/com/chinaunicom/mall/ebtp/common/idempotent/aspect/IdempotentAspect.java @@ -14,6 +14,7 @@ import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -34,7 +35,8 @@ import java.util.concurrent.TimeUnit; @Aspect public class IdempotentAspect { - @Autowired + @Autowired(required = false) + @Qualifier("idempotentRedisTemplate") private RedisTemplate redisTemplate; /**redis键值*/ diff --git a/uboot-core/src/main/java/com/chinaunicom/mall/ebtp/common/sharding/aspect/RequestShardValueAspect.java b/uboot-core/src/main/java/com/chinaunicom/mall/ebtp/common/sharding/aspect/RequestShardValueAspect.java index bd21783..f5df85c 100644 --- a/uboot-core/src/main/java/com/chinaunicom/mall/ebtp/common/sharding/aspect/RequestShardValueAspect.java +++ b/uboot-core/src/main/java/com/chinaunicom/mall/ebtp/common/sharding/aspect/RequestShardValueAspect.java @@ -19,6 +19,7 @@ import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.annotation.Order; import org.springframework.data.redis.core.RedisTemplate; @@ -45,7 +46,9 @@ public class RequestShardValueAspect { private KeyResolver keyResolver; @Autowired private ProcessService processService; - @Autowired + + @Autowired(required = false) + @Qualifier("shardingRedisTemplate") private RedisTemplate redisTemplate;