0
点赞
收藏
分享

微信扫一扫

redis多数据源配置

瑾谋 2022-12-05 阅读 143

该篇文章主要描述redis多数据源的配置

添加redis依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>

redis配置文件(核心)

@Configuration
public class RedisConfig {

public LettuceConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties) {
RedisProperties.Cluster cluster = redisProperties.getCluster();
if (Objects.nonNull(cluster)) {
Map<String, Object> source = new HashMap<>();
source.put(spring.redis.cluster.nodes, cluster.getNodes());
source.put(spring.redis.cluster.max-redirects, cluster.getMaxRedirects());
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource(redisClusterConfiguration, source));
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
RedisProperties.Pool pool = redisProperties.getLettuce().getPool();
poolConfig.setMaxIdle(pool.getMaxIdle());
poolConfig.setMinIdle(pool.getMinIdle());
poolConfig.setMaxTotal(pool.getMaxIdle());
return new LettuceConnectionFactory(redisClusterConfiguration, getLettuceClientConfiguration(poolConfig));
} else {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setPort(redisProperties.getPort());
redisStandaloneConfiguration.setHostName(redisProperties.getHost());
redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());
return new LettuceConnectionFactory(redisStandaloneConfiguration);
}
}

private LettuceClientConfiguration getLettuceClientConfiguration(GenericObjectPoolConfig genericObjectPoolConfig) {
ClusterTopologyRefreshOptions topologyRefreshOptions =
ClusterTopologyRefreshOptions.builder()
.enableAllAdaptiveRefreshTriggers()
.adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30))
.enablePeriodicRefresh(Duration.ofSeconds(20))
.build();
return LettucePoolingClientConfiguration.builder()
.poolConfig(genericObjectPoolConfig)
.clientOptions(ClusterClientOptions.builder().topologyRefreshOptions(topologyRefreshOptions).build())
.build();
}

@Bean(redisTemplate)
@Primary
public RedisTemplate<String, Object> redisTemplate(RedisProperties redisProperties) {
LettuceConnectionFactory lettuceConnectionFactory = lettuceConnectionFactory(redisProperties);
lettuceConnectionFactory.afterPropertiesSet();
return build(lettuceConnectionFactory);
}

@ConditionalOnProperty(value = spring.redis.custom.enable, havingValue = true, matchIfMissing = false)
@Bean(customRedisTemplate)
public RedisTemplate customRedisTemplate(@Value(${spring.redis.custom.host})String host,
@Value(${spring.redis.custom.port})int port,
@Value(${spring.redis.custom.database})int database)
{
RedisProperties redisProperties = new RedisProperties();
redisProperties.setDatabase(database);
redisProperties.setHost(host);
redisProperties.setPort(port);
LettuceConnectionFactory customeLettuceConnectionFactory = lettuceConnectionFactory(redisProperties);
// 不加此行会报错 LettuceConnectionFactory was not initialized through afterPropertiesSet()
customeLettuceConnectionFactory.afterPropertiesSet();
return build(customeLettuceConnectionFactory);
}

private RedisTemplate build(LettuceConnectionFactory lettuceConnectionFactory) {
// 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
//忽略没有的字段
objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);

GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
RedisSerializer<?> stringSerializer = new StringRedisSerializer();
// key序列化
redisTemplate.setKeySerializer(stringSerializer);
// value序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
// Hash key序列化
redisTemplate.setHashKeySerializer(stringSerializer);
// Hash value序列化
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

注意配置 lettuceConnectionFactory.afterPropertiesSet(); @ConditionalOnProperty(value = "spring.redis.custom.enable",

配置文件application.properties


spring.application.name=demo

server.port=8090

# redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.max-wait=0

# 自定义配置
spring.redis.custom.enable=false
spring.redis.custom.host=127.0.0.1
spring.redis.custom.port=6380
spring.redis.custom.database=1

工具类SpringContext

@Component
public class SpringContext implements ApplicationContextAware {
private static ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContext.applicationContext = applicationContext;
}

public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}

public static <T> T getBean(String beanName, Class<T> clazz) {
return applicationContext.getBean(beanName, clazz);
}
}

测试类RedisRest

@RestController
@RequestMapping(/user)
public class RedisRest {

private static final String SUCCESS = success;

@Autowired
private RedisTemplate redisTemplate;

@Autowired
private Environment environment;

@GetMapping(/setValue)
public String setValue(@RequestParam String key, @RequestParam String value) {
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, value);
if (environment.getProperty(spring.redis.custom.enable, Boolean.class)) {
RedisTemplate customRedisTemplate = SpringContext.getBean(customRedisTemplate, RedisTemplate.class);
if (Objects.nonNull(customRedisTemplate)) {
ValueOperations customValueOperations = customRedisTemplate.opsForValue();
customValueOperations.set(key, value);
}
}
return SUCCESS;
}

@GetMapping
public String getValue(@RequestParam String key) {
RedisTemplate customRedisTemplate = SpringContext.getBean(customRedisTemplate, RedisTemplate.class);
String src = redisTemplate.opsForValue().get(key).toString();
String values = src;
if (Objects.nonNull(customRedisTemplate)) {
values = values.concat(,custom:).concat(customRedisTemplate.opsForValue().get(key).toString());
}
return values;
}

}

举报

相关推荐

0 条评论